虚拟文件系统VFS:内核子系统,为内核用户程序提供文件和文件系统的相关接口。
一、通用文件系统接口:
可以使用通用系统调用对不同介质和文件系统进行操作。
原因:内核在底层文件系统接口建立抽象层——通用文件系统模型,包括文件系统常用功能集和行为,使得linux能够支持各种文件系统。实际文件系统通过编程提供VDS期望的抽象接口和数据结构。
流程:用户空间操作——> 虚拟文件系统接口——>实际文件系统对应的操作——>物理介质工作
二、VFS中对象&数据结构:
使用数据结构来代表通用文件对象,每个文件对象包括操作对象,操作对象描述了内核针对主要文件对象可以使用的方法,操作对象通过结构体指针实现。
1)超级块对象:代表具体的已经安装的文件系统。超级块存储文件系统的信息。
操作对象:super_operation,内核针对特定文件系统所能调用的方法。
super_block结构体定义于<linux/fs.h>,结构体中的每项是指向超级快操作函数的指针。
操作包括:创建、初始化、读、写索引节点。在VFS进程上下文中调用。
2)索引节点对象:包含了内核在操作文件或目录时需要的全部信息。
索引节点对象:inode结构体,定义在<linux/fs.h>。一个索引节点代表文件系统的一个文件。
操作对象:
inode_operation,内核针对特定文件所能调用的方法。
对指定索引及索引对象进行创建,符号链接,目录的操作,
3)目录项对象:目录项代表路径的组成部分,注意目录当做文件来对待。
目录项对象:路径中的每个对象都是目录项对象。由dentry结构体表示,定义在<linux/dcache.h>中,并非保存在磁盘上,根据字符串形式的路径名现场创建;状态:被使用、未被使用、负状态;目录项缓存中被使用链表。
操作对象:
dentry_operation,内核针对特定目录所能调用的方法,定义在<linux/dcache.h>中。
4)文件对象
文件对象:file表示,定义在<linux/fs.h>中,打开的文件在内存中的表示,由系统调用open创建,close撤销,没有对应的磁盘数据,反过来指向索引节点。
操作对象:file_operation,内核针对进程已打开文件所能调用的方法,包括各种读写方式等。
与进程有关的数据结构:file_struct,fs_struct,namespace。
5)其它对象
file_system_type:描述文件系统类型;
vfsmount:安装点,描述暗转文件系统的实例;