<Linux kernel development>Chap12 虚拟文件系统VFS
时间:2009-04-17 来源:wthsunny
使用户可以直接使用系统调用而无需考虑具体文件系统或实际物理介质。
12.2 文件系统抽象层
之所以可以用这种通用接口对所有类型的文件系统进行操作,是因为内核在底层文件系统接口上建立了一个抽象层,定义了所有文件系统都支持的基本接口和数据结构。
例如:
write()调用将来自用户空间的数据流,首先通过VFS通用系统调用,其次通过文件系统的特殊写方法,写入物理介质。
12.3 Unix文件系统
(1) 文件——有序字节串
(2) 目录项
(3) 索引节点——文件的相关信息,包括访问控制权限、大小、拥有者、创建时间等
(4) 安装点
12.4 VFS对象及数据结构
四个主要的对象类型:
(1) 超级块对象,代表一个已安装的文件系统
(2) 索引节点对象,代表一个文件
(3) 目录项对象,代表一个目录项,是路径的一个组成部分
(4) 文件对象,代表由进程打开的文件
主要的操作对象:
(1) super_operations对象——内核针对特定文件系统所能调用的方法,read_inode()、sync_fs()等;
(2) inode_operations对象——内核对特定文件所能调用的方法,create()、link()等;
(3) dentry_operations对象——内核对特定目录所能调用的方法,d_compare()、d_delete()等;
(4) file对象——进程对已代开文件所能调用的方法,read()、write()等。
12.5 超级块对象
存储特定文件系统信息,存放于磁盘特定扇区中。
<linux/fs.h>
struct super_block { |
struct super_operations { |
调用方法:sb->s_op->write_super(sb);
12.6 索引节点对象
包含内核在操作文件或目录时需要的全部信息。
<linux/fs.h>
struct inode { |
调用:i->i_op->truncate(i)
12.7 目录项对象
每个dentry对象代表路径中的一个特定部分。
<linux/dcache.h>
struct dentry { |
VFS层遍历路径名中的所有元素并将之解析成目录项对象非常耗时 => 目录项缓存(dcache)
目录项缓存:
被使用的目录项链表——通过索引节点对象中的i-dentry项链接相关的索引节点
最近被使用的双向链表——含有未被使用和负状态的目录项对象,链头节点最新,链尾最旧
散列表和相关的散列函数——用于快速将给定路径解析为相关目录项对象
=> dcache一定程度上也提供对索引节点的缓存
struct dentry_operations { |
12.8 文件对象
表示进程已打开的文件。
文件对象与用户空间联系最紧密,因为进程直接处理的是文件,而不是超级块、索引节点或目录项。
由于多个进程可以同时打开和操作同一个文件,因此一个文件对应的文件对象不是唯一的,但对应的索引节点的目录项是唯一的。只有目录项对象才表示已打开的实际文件。
<linux/fs.h>
struct file { |
struct file_operations { |
12.9 和文件系统相关的数据结构
file_system_type——描述各种特定文件系统类型,比如ext3或XFS
每种文件系统,不管有多少个实例安装到系统中,还是根本就没安装到系统中,都只有一个file_system_type结构。
struct file_system_type { |
vfsmount——当文件系统被实际安装时,在安装点创建一个vfsmount结构。
<linux/mount.h>
struct vfsmount { |
vfsmount结构还保存了安装时指定的标志信息,存储在mnt_flags域中。
Flag |
Description |
MNT_NOSUID |
Forbids setuid and setgid flags on binaries on this filesystem 禁止该文件系统的可执行文件设置setuid和setgid标志 |
MNT_NODEV |
Forbids access to device files on this filesystem 禁止访问该文件系统上的设备文件 |
MNT_NOEXEC |
Forbids execution of binaries on this filesystem 禁止执行该文件系统上的可执行文件 |
12.10 和进程相关的数据结构
struct files_struct { |
<linux/file.h>,包含所有与每个进程相关的信息,如打开的文件及文件描述符等。由进程描述符的files域指向
struct fs_struct { |
<linux/fs_struct.h>,包含当前进程的当前工作目录和根目录,由进程描述符的fs域指向
struct namespace { |
<linux/namespace.h>,使得每个进程在系统中看到唯一的安装文件系统(不仅是唯一的根目录,而且是唯一的文件系统层次结构)