书到用时方恨少 事非经过不知难
说到linux VFS, 就要知道:
- 她基于类unix文件系统
- 采用面向对象思想进行设计,抽象出通用的接口,隐藏了具体文件系统的实现细节。
主要有4个对象, superblock, inode dentry, file. 每个对象都由一个数据结构来表示,这个数据结构里有操作它的函数批针,以及一些表示特定性的成员。
superblock:
- filesystem metadata 相应于整个文件系统,
- 有相对应的on-disk data, 因此有dirty flag
inode :
- file metatdata相应于一个具体的文件
- 有相对应的on-disk data, 因此有dirty flag
dentry:
- directory entry, a companent 为了快速path lookup而生的对象,
- 没有相对应的on-disk data, 因此没有dirty flag
file:
- 代表一个被进程打开的文件,
- 没有相对应的on-disk data, 因此没有dirty flag
在4个对象中, file的operations table比较重要,因为它们组成了最基本的unix system call.
此外在VFS中, 还有两个重要的object.
file_system_type:
描述一个具体的文件系统。一个文件系统只有一个file_system_type, 不管它有多少 个实例mount在系统上。举个例子,你有一个U盘被格式化成了vfat文件系统,有一个硬盘也被格式化成了vfat系统,它们都是vfat文件系统的一个实例,而系统中,真正表示vfat这个文件系统的只有一个file_system_type结构。
vfsmount:
它表示一个文件系统的具体实例, 换句话说, 就是一个mount point.
和进程相关的文件系统数据结构:
每个进程都有一列打开的文件,自己的根文件系统,自己的working directory, 自己的mount point等等。
进程描述符数据结构中,就有很多和文件系统相关的成员。
进程描述符的files成员指向一个files_struct结构, 表示该进程打开的一系列文件。
fs成员指向的一个fs_struct结构,表示该进程相关的文件系统的信息。如之前提到的自己的根文件系统,自己的working directory。
mnt_namespace指向一个mnt_namespace结构。每个进程都有自己的命名空间,即自己对系统上文件系统体系层次的独立