Appearance
虚拟文件系统
考情分析
VFS 在 408 真题中考查较少,属于 🔥 低频考点,但偶尔以选择题形式出现。
系统盘用 ext4,U 盘用 FAT32,网络共享用 NFS——用户不想关心文件在哪种文件系统上,只想用同一套 open/read/write 操作。VFS 就是为了解决这个"统一入口"的问题。
多文件系统的统一抽象
现代操作系统可能同时挂载多种不同的文件系统:
- 系统盘:ext4
- U盘:FAT32
- 网络共享:NFS
- 光盘:ISO 9660
用户不希望对不同文件系统使用不同的系统调用。VFS 的目标是:对上层提供统一的文件操作接口,对下层适配不同的文件系统实现。
VFS 的层次结构
VFS 定义了一组标准接口,每个具体的文件系统只需要实现这些接口即可接入系统。VFS 就像万能充电头——对上统一是 USB-C 接口(系统调用),对下通过不同的转接头适配各种设备(ext4、FAT32、NFS)。
VFS 的核心数据结构
VFS 定义了四个关键的抽象对象:
| 对象 | 说明 |
|---|---|
| 超级块对象(superblock) | 代表一个已挂载的文件系统,包含文件系统的全局信息 |
| 索引节点对象(inode) | 代表一个文件的元数据(VFS 统一的 inode,称为 vnode) |
| 目录项对象(dentry) | 代表路径中的一个分量(如 /home/alice 中的 home 和 alice) |
| 文件对象(file) | 代表一个已打开的文件,包含文件指针等运行时信息 |
vnode vs inode
| 概念 | 说明 |
|---|---|
| vnode | VFS 层的统一文件表示,与具体文件系统无关 |
| inode | 具体文件系统(如 ext4)中的索引节点 |
vnode 包含一个指向具体文件系统 inode 的指针和一组函数指针(指向该文件系统的操作实现)。
vnode
├── 文件系统类型
├── 通用属性(大小、权限...)
├── 操作函数指针 → { .read = ext4_read, .write = ext4_write, ... }
└── 具体 inode 指针 → ext4_inode_infoVFS 的工作流程
以 read(fd, buf, n) 为例:
- 通过 fd 找到进程打开文件表中的 file 对象
- file 对象中包含 vnode 指针
- vnode 中包含
read函数指针,指向具体文件系统的读操作 - 调用具体文件系统的读操作完成数据读取
这个过程对用户完全透明——用户不需要知道文件位于哪种文件系统上。
考研高频考点
- 🔥🔥 VFS 的作用(统一不同文件系统的接口)
- 🔥 VFS 的四个核心对象(超级块/inode/dentry/file)
- 🔥 vnode 与具体文件系统 inode 的关系
VFS 提供了统一接口,但不同的文件系统要先"挂载"到目录树上才能被访问。下一篇来看文件系统挂载的过程。