Appearance
VFS(Virtual File System)—— Linux 的"一切皆文件"是怎么实现的
VFS 是 Linux 内核中的一层多态框架——它定义了一套统一的文件操作接口(file_operations),让用户态的 open() / read() / write() / close() / poll() / mmap() 对所有文件类型一致工作,不管底层是 ext4、pipe、socket、procfs 还是 eventfd。
知识地图

阅读路径
| 目标 | 路径 |
|---|---|
| 快速了解 VFS 是什么 | vfs-overview.md → §一 + §三 |
| 理解进程怎么通过 fd 使用 VFS | vfs-from-process.md → §二(五跳链路)+ §四(read 路径) |
理解 open() 怎么选择文件系统 | vfs-from-process.md → §三(open 全过程时序) |
| 理解 fork 后 fd 的共享行为 | vfs-from-process.md → §六(fork 与 VFS) |
理解 read() 怎么分发到不同 FS | vfs-overview.md → §三 多态分发 |
查某个 file_operations 字段的作用 | vfs-file-operations.md → §二 逐字段表格 |
理解 socket 为什么能用 read()/poll() | vfs-and-socket.md → §一 + §三 |
理解 close() 和四次挥手的关系 | vfs-and-socket.md → §四 |
| 理解 epoll 为什么能统一监视 fd | vfs-and-socket.md → §五 好处一 |
| 理解 FUSE 用户态文件系统怎么工作 | fuse.md → §零 + §一(架构 + 数据结构) |
| 理解 FUSE 多挂载点怎么隔离 | fuse.md → §二(多挂载点隔离) |
理解 f_op / private_data / s_fs_info 三层分层 | fuse.md → §五(三层隔离设计) |
| 了解内核提供了哪些伪文件系统 | special-filesystems.md → §二 分类全景 + §三 逐个详解 |
| 从性能视角找关键数据源路径 | special-filesystems.md → §五 性能工程师视角 |
六篇文档的关系
| 文档 | 主题 | 视角 |
|---|---|---|
| vfs-overview.md | VFS 架构全景 | 内核设计者视角:VFS 的四对象模型、多态分发机制、在整体内核中的位置 |
| vfs-from-process.md | 进程如何感知 VFS | 用户/进程视角:fd 怎么连到 VFS、open/read/close 走过什么路径、fork 怎么共享 |
| vfs-file-operations.md | file_operations 逐字段拆解 | 接口定义视角:每一个函数指针的签名、语义、各文件系统怎么填 |
| vfs-and-socket.md | socket 与 VFS 的深度融合 | 文件类型实例视角①:socket 如何借 VFS 之力实现 read/poll/close |
| fuse.md | FUSE 用户态文件系统 | 文件类型实例视角②:FUSE 如何通过 /dev/fuse 把 VFS 请求代理到用户态,多挂载点隔离 |
| special-filesystems.md | 内核伪文件系统全景 | 文件类型实例视角③:内核自身提供的 12 种伪文件系统——从 procfs/sysfs 到 debugfs/tracefs/cgroupfs 的完整图谱与性能数据源速查 |
仓库内交叉索引
VFS 不是孤岛——它是 fd 表的下游、syscall 的下一站、read/write 的必经之路、mmap 的入口:
| 关联模块 | 文档 | 连接点 |
|---|---|---|
| fd 表 | /concepts/process/task-resources/files-struct.md | files_struct.fd_array[fd] → struct file,是 VFS 的入口 |
| 系统调用 | /concepts/process/syscall.md | syscall 陷入内核后第一站就是 VFS |
| I/O 全链路 | /concepts/io/read-write-process.md | VFS 在 10 层调用链中处于第 5 层 |
| mmap | /concepts/elf/mmap.md | mmap() → VFS → file->f_op->mmap → 建立 VMA |
| socket 内核 | /concepts/network/socket-kernel-internals.md | socket() 内部分配双层结构,VFS 视角看 socket |
| epoll | /concepts/network/epoll.md | epoll 依赖 file->f_op->poll 注册回调 |
| 零拷贝 | /concepts/network/zero-copy.md | sendfile/splice 利用 socket 的 sendpage/splice_write |
| fcntl 非阻塞 | /concepts/network/kernel-tuning-net.md | O_NONBLOCK 存在 file->f_flags,VFS 统一管理 |
| FUSE 文件系统 | /concepts/vfs/fuse.md | FUSE 作为 VFS 多态分发的典范——super_block->s_fs_info 隔离挂载点、file->private_data 隔离会话 |
| 内核伪文件系统 | /concepts/vfs/special-filesystems.md | VFS 框架下的完整实现侧图谱——procfs/sysfs/debugfs/tracefs/cgroupfs 等 12 种伪文件系统的用途、数据源、性能视角 |
一句话总结
VFS 是 Linux 内核的"文件多态层"——用一张 file_operations 函数指针表约 30 个字段定义文件操作协议,让 ext4/pipe/socket/procfs/eventfd 等二十多种文件类型复用同一套系统调用接口,用户态只认 fd、不认底层。FUSE 更进一步把这套多态能力延伸到用户态,通过 /dev/fuse 让普通进程也能实现完整文件系统语义。