VFS对象及数据结构
VFS的四个对象类型:
- 超级块对象:代表具体的文件系统
- 索引节点对象:代表具体文件
- 目录项对象:代表目录项,是路径的一个组成部分
- 文件对象:代表进程打开的文件
注意:VFS将目录作为一个文件来处理,不存在目录对象;目录项不同于目录
每个对象中都包含一个操作对象,其中描述了内核针对主要对象可以使用的方法
super_operations
对象:内核针对特定文件系统调用的方法,如write_inode(), sync_fs()
inode_operations
对象:内核针对特定文件调用的方法,如create(), link()
dentry_operations
对象:内核针对特定目录项所能调用的方法,如d_compare(), d_delete()
file_operations
对象:进程针对已打开文件所能调用的方法,如read(), write()
注意:操作对象作为结构体,其中包含操作父对象的函数指针,实际的文件系统可以继承VFS提供的通用函数。
超级块
各种文件系统都必须实现超级块对象,该对象存储特定文件系统的信息,对应于存放在磁盘特定扇区中文件系统超级块或者文件系统控制块。(非基于磁盘的文件系统,会在使用现场创建超级块并保存在内存中)
- 超级块结构super_block

主要成员:
- s_dirty:脏inode的链表,在同步内存数据和底层存储介质时,使用该链表更加高效
- s_files:包含一系列file结构,列出了该超级块表示的文件系统所有打开的文件,内核在卸载文件系统时会参考该链表
- s_dev和s_bdev指定了底层文件系统的数据所在的块设备,前者使用了内核内部编号,后者指向block_device结构
- s_root:用于检查文件系统是否装载,如果为NULL,该文件系统是一个伪文件系统,只在内核可见,否则,在用户空间可见
注意:超级块对象通过alloc_super()
函数创建并初始化,在安装文件系统时,文件系统会调用这个函数从磁盘读取文件系统超级块,并将其中的数据填充到内存中的超级块对象对应的结构体中。
-
超级块操作
超级块对象中s_op指针,指向超级块的操作函数表,由
super_operations()
表示,如下图:
该结构中的操作会控制底层文件系统实现获取和返回inode的方法,不会改变inode的内容
inode对象
索引节点对象:包含内核在操作文件系统或者目录时需要的全部信息(对于Unix风格的系统,直接从磁盘的索引节点读入),索引节点对象必须在内存中创建
inode的结构如下: