虚拟文件系统:
系统中所有的文件系统不但依赖于VFS共存,而且也依赖于VFS系统协同工作。通过虚拟文件系统,程序可以利用标准的UNIX
文件系统调用对不同介质上的不同文件系统进行相应的操作。
两种不同的介质,两种不同的文件系统,连接到同一个虚拟文件系统上。
虚拟文件系统为何有如此强大的功能,为此,虚拟文件系统提供一个抽象层,该层为用户提供统一的通用文件操作接口,用户根本
不用关心底层的实现,文件系统抽象层也是为具体的文件系统实现方法提供接口。
比如:常见的用户调用write()首先通过VFS的通用系统调用,其次通过文件系统提供的特殊写方法,最后写入物理介质中。
UNIX文件系统提供了四种和文件系统相关的传统抽象概念:文件,目录项,索引节点和安装点。
VFS中有四个树妖的对象类型:
超级块对象:代表一个已安装文件系统。存储特定文件系统的信息。存放于磁盘特定扇区中的文件系统超级块或者文件系统控制块。
超级块对象由super_block结构表示,其中有一个属性域就是指向超级块操作函数表,超级块操作函数表由super_operations结构表示。每一项都是
指向一个超级块操作函数的指针。
索引节点对象:代表一个文件。包含了内核在操作文件或目录时需要的全部信息。索引节点对象由Inode结构体表示。
索引节点对象中的inode_operations项包含VFS操作索引节点对象的所有方法。
目录项对象:代表一个目录项,是路径的一个组成部分。如果VFS层遍历路径名中所有的元素并将它们逐个的解析成目录项对象,
将是一件非常费力的工作,会浪费大量的时间。所以内核将目录项对象缓存在目录项缓存中。
文件对象:代表由进程打开的文件。文件对象仅仅是进程观点上代表已打开文件,反过来指向目录项对象,只有目录项对象才表示
已打开的实际文件。文件对象由file结构体表示。文件对象通过f_dentry指针指向相关的目录项对象。目录项对象指向相关的索引节点,
索引节点会记录文件是否是脏的。
linux提供了三种数据结构将VFS层和系统进程紧密联系起来。files_struct, fs_struct, namespace结构体,进程描述符都有指向
这三个结构体的指针。