这篇文章是《读薄「Linux 内核设计与实现」》系列文章的第 VI 篇,本文主要讲了以下问题:Linux 虚拟文件系统的概念、相关接口等内容。
0x00 虚拟文件系统概念
- 虚拟文件系统(VFS)为用户空间提供了文件系统接口
- VFS 协同不同文件系统的工作
0x01 通用文件接口
- VFS 使得用户可以直接使用
open()
,read()
,write()
这样的系统调用而无需考虑具体文件系统和实际物理介质
0x02 文件系统的抽象层
- VFS 提供了一个通用的文件系统模型,该模型囊括了任何文件系统的常用功能集合和行为
- 它定义了所有文件系统都支持的、基本的、概念上的接口和数据结构
- 对一个具体实现的文件系统,在处理时需要概念上的转换,例如将目录看为文件
0x03 VFS 中的对象
I 超级块对象
它代表一个具体的已安装文件系统,各种文件系统都必须实现超级块对象,用于存放特定文件系统的信息
它由super_block
结构体表示,定义于<linux/fs.h>
中
II 索引节点对象
它代表一个具体文件,包含了内核在操作文件或目录时需要的全部信息,索引节点对象由 inode 结构体表示,她定义在 <linux/fs.h>
中
III 目录项对象
VFS 把目录项当做文件对待,为了方便查找操作,引入目录项概念,每个 dentry 代表路径中的一个特定部分,目录项由 dentry 结构体表示,定义在文件 <linux/dcache.h>
中
目录项对象有 3 种状态:
- 被使用:该目录项对用一个有效的索引节点(d_inode 所指的),且存在一个或多个使用者
- 未被使用:该目录项对应一个有效的索引节点,但 VFS 当前未使用它(d_count = 0)
- 负状态:该目录项没有对应的有效索引节点(d_inode 为 NULL)
目录项缓存主要包括 3 个部分:
- 『被使用的』目录项链表:一个给定的索引节点可能有多个链接,可能有多个目录项对象,用链表连接
- 『最近被使用的目录项的』双向链表:该链表含有被使用的和负状态的目录项对象
- 散列表和散列函数用来快速地将给定路径解析为相关目录项对象
IV 文件对象
文件对象表示进程已打开的文件,是已打开的文件在内存中的表示,由 file 结构体表示,定义在文件 <linux/fs.h>
中。
本文的版权归作者 罗远航 所有,采用 Attribution-NonCommercial 3.0 License。任何人可以进行转载、分享,但不可在未经允许的情况下用于商业用途;转载请注明出处。感谢配合!