Linux 虚拟文件系统(VFS)是内核中的一个软件抽象层。它的核心设计哲学是“一切皆文件”和“利用 C 语言结构体与函数指针实现面向对象的多态”。
VFS 屏蔽了底层各种具体文件系统(如 Ext4, XFS, FAT32, NTFS)的差异,为用户态提供了一套统一的系统调用接口(open,read,write,close)。
VFS 的四大核心对象模型:
超级块对象 (super_block):代表一个已挂载的具体文件系统实例。
索引节点对象 (inode):代表文件系统中的具体文件(包含元数据:大小、权限、时间戳,以及指向数据块的指针)。
目录项对象 (dentry):代表目录树中的一个节点(用于路径查找和缓存)。
文件对象 (file):代表进程打开的一个文件实例(包含当前读写偏移量f_pos和访问模式)。
vfs数据结构关系图
💡 核心架构设计解析
这张高级类图完美映射了 Linux 内核 C 语言设计的精髓,请注意图中四种不同连线的含义:
1. 组合 (Composition)*--(实心菱形)
2. 聚合 (Aggregation)o--(空心菱形)
3. 关联 (Association)-->(普通实线)
4. 依赖/多态 (Dependency)..>(虚线)
含义:一个类依赖于另一个类(通常是接口),在运行时动态绑定。
C语言映射:函数指针结构体(虚函数表)。这是 VFS 最核心的设计!
图例:file ..> file_operations。VFS 层不关心底层是 Ext4 还是 FAT。当调用read()时,VFS 直接执行file->f_op->read_iter()。具体文件系统在挂载时,将自己的实现(如ext4_file_read_iter)赋值给这个函数指针,从而完美实现了 C 语言下的多态。
vfs软件层级图
read系统调用核心逻辑
展示用户态调用read()后,内核从 VFS 层穿透到具体文件系统,再到 Page Cache 的完整控制流。
read与 Page Cache 时序图
VFS LayerExt4 FSPage CacheBlock LayerDisk HW
💡 时序图解析: