读薄《Linux 内核设计与实现》(6) - 虚拟文件系统

这篇文章是《读薄「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。任何人可以进行转载、分享,但不可在未经允许的情况下用于商业用途;转载请注明出处。感谢配合!