<aside> 💡 VFS 是对各种文件系统的统一抽象,为用户应用程序提供了一致的文件系统接口。
</aside>
VFS 通过一个或多个双向循环链表将这些数据结构串联起来方便查询,VFS 数据结构就好比磁盘元数据在内存上的映射,并额外赋予了目录树构建、文件系统挂载、进程关联等特性。
<aside> 🗣 共同点:文件系统对象往往包含用于链表的指针域成员对象(list_head)和操作函数指针(多态)
</aside>
superblock
: 超级块对象描述了整个文件系统的元数据,通常一个设备/分区对应了一个文件系统(以下称为FS),元信息包括 FS 的空间分配情况、入口目录、设备类型等。inode
:索引节点是单个文件的元数据,描述了文件类型、分配到的磁盘块位置等信息。dentry
:目录项是描述文件之间关联的单元,从 FS 的角度来看,文件之间通常以目录树的结构关联起来,目录本身也被视为文件。
file
:文件对象是进程与文件的关联抽象,一个进程打开一个文件时就会产生一个file
对象,该结构体中保存了文件指针、打开方式等文件操作相关信息。注意一个文件可能对应多个file
,因为可能被多个进程打开,由此可见file
是关联的抽象而非文件的抽象namespace
:命名空间是 vfsmount 在不同进程视图下的集合,不同的进程看到的 vfsmounts 结构可能不同
vfsmount
:已安装文件系统对象保存了文件系统的安装点、安装标志以及与系统中其他 FS 的关系,一次 mount 就会产生一个vfsmount
。file_system_type
:文件系统类型的抽象,vfsmount
就好比file_system_type
的实例。文件系统类型和超级块对象的关联如下图所示。VFS 主要数据结构的大致关联如下图所示:
VFS 数据结构关系图
各种类型的 FS 源代码主要来源:
内核对这些 FS 的”跟踪“行为就叫做文件系统注册,注册的文件系统类型对应file_system_type
结构体。下图展示了内核注册文件系统的流程: