当前位置:首页>Linux>Linux VFS 基本知识概述

Linux VFS 基本知识概述

  • 2026-10-11 07:08:56
Linux VFS 基本知识概述

    Linux 虚拟文件系统(VFS)是内核中的一个软件抽象层。它的核心设计哲学是“一切皆文件”和“利用 C 语言结构体与函数指针实现面向对象的多态”。

    VFS 屏蔽了底层各种具体文件系统(如 Ext4, XFS, FAT32, NTFS)的差异,为用户态提供了一套统一的系统调用接口(open,read,write,close)。

VFS 的四大核心对象模型:

  1. 超级块对象 (super_block):代表一个已挂载的具体文件系统实例。

  2. 索引节点对象 (inode):代表文件系统中的具体文件(包含元数据:大小、权限、时间戳,以及指向数据块的指针)。

  3. 目录项对象 (dentry):代表目录树中的一个节点(用于路径查找和缓存)。

  4. 文件对象 (file):代表进程打开的一个文件实例(包含当前读写偏移量f_pos和访问模式)。


vfs数据结构关系图 

图1

💡 核心架构设计解析

    这张高级类图完美映射了 Linux 内核 C 语言设计的精髓,请注意图中四种不同连线的含义:

1. 组合 (Composition)*--(实心菱形)

  • 含义:强生命周期绑定,“部分”不能脱离“整体”存在。

  • C语言映射:结构体直接内嵌(非指针)。

  • 图例:file *-- path和inode *-- address_space。在源码中,struct file内部直接包含了struct path f_path;,而不是指针。当file被销毁时,path也随之消亡。特别是inode内嵌的i_data(地址空间),它是该文件专属的 Page Cache 管理器。

2. 聚合 (Aggregation)o--(空心菱形)

  • 含义:弱生命周期绑定,“部分”可以脱离“整体”独立存在。

  • C语言映射:结构体指针引用,且表示一种包含关系。

  • 图例:path o-- dentry。path结构体中包含了一个struct dentry *dentry;指针。dentry可以在没有path的情况下独立存在于 dentry cache 中。

3. 关联 (Association)-->(普通实线)

  • 含义:两个独立实体之间的结构关系。

  • C语言映射:普通的结构体指针引用。

  • 图例:dentry --> inode。目录项通过d_inode指针找到对应的索引节点。一个inode可以被多个dentry关联(硬链接机制)。

4. 依赖/多态 (Dependency)..>(虚线)

  • 含义:一个类依赖于另一个类(通常是接口),在运行时动态绑定。

  • C语言映射:函数指针结构体(虚函数表)。这是 VFS 最核心的设计!

  • 图例:file ..> file_operations。VFS 层不关心底层是 Ext4 还是 FAT。当调用read()时,VFS 直接执行file->f_op->read_iter()。具体文件系统在挂载时,将自己的实现(如ext4_file_read_iter)赋值给这个函数指针,从而完美实现了 C 语言下的多态。


vfs软件层级图

图2

read系统调用核心逻辑

    展示用户态调用read()后,内核从 VFS 层穿透到具体文件系统,再到 Page Cache 的完整控制流。

图3

read与 Page Cache 时序图

VFS LayerExt4 FSPage CacheBlock LayerDisk HW

图4

💡 时序图解析:

  • 快速路径 (Hit):如果数据已经在内存(Page Cache)中,直接通过copy_to_user拷贝给用户态,全程不涉及磁盘 I/O,速度极快。

  • 慢速路径 (Miss):如果缓存未命中,内核会分配物理页,构建 BIO (Block I/O) 结构体提交给块设备层。此时当前进程会被挂起(休眠),直到磁盘硬件完成 DMA 传输并触发硬件中断,内核才会将进程唤醒并拷贝数据。


最新文章

随机文章