Linux VFS 抽象层全解析:统一接口的力量


🎥 对应 B 站子视频讲解传送门:点击直达 VFS 抽象层讲解视频


🔧 Linux VFS 抽象层全解析:统一接口的力量

📌 为什么要深入理解 VFS 抽象层?

Linux 支持众多文件系统,如 ext4、tmpfs、procfs 等,VFS(虚拟文件系统)则是内核的统一接口抽象层。

核心目的:屏蔽底层文件系统差异,提供统一访问接口


在这里插入图片描述


🧱 一、VFS 在 Linux 文件系统中的位置

Linux 文件系统子系统
├── 应用层接口:open()/read() 等系统调用
├── VFS 抽象层:file/inode/dentry/super_block 等核心结构体
└── 文件系统实现层:ext4、tmpfs、procfs 等具体文件系统

VFS 的关键结构体及作用:

结构体核心作用
file表示打开文件的操作会话,包含读写位置、权限
inode表示文件实体的元数据,如权限、大小、时间戳
dentry表示目录项缓存,加速路径名解析
super_block表示一个文件系统的挂载实例,维护全局状态

📖 二、核心结构体深入讲解

file 结构体

struct file {
    const struct file_operations *f_op; // 文件操作接口
    struct dentry *f_path;              // 路径信息
    loff_t f_pos;                       // 读写偏移
    ...
};

inode 结构体

struct inode {
    umode_t i_mode;               // 文件类型与权限
    struct file_operations *i_fop; // 默认操作函数集
    struct super_block *i_sb;     // 所属的 super_block
    ...
};

dentry 结构体

struct dentry {
    struct inode *d_inode;         // 对应的 inode
    struct qstr d_name;            // 当前目录项名
    struct dentry *d_parent;       // 父目录项
    ...
};

✅ 详细讲解 super_block 结构体

super_block 是文件系统挂载时核心的全局信息结构,记录文件系统的整体状态。

struct super_block {
    struct file_system_type *s_type;   // 文件系统类型(如ext4、tmpfs)
    struct dentry *s_root;             // 文件系统根目录的目录项
    struct inode *s_inodes;            // inode链表头,管理所有inode
    struct list_head s_mounts;         // 连接所有挂载点
    unsigned long s_flags;             // 挂载标志,如只读、读写等
    struct super_operations *s_op;     // 超级块操作方法(如读取inode、清理)
    void *s_fs_info;                   // 文件系统私有信息(不同文件系统专用数据)
    ...
};
🔍 super_block 各字段的详细说明:
  • s_type:标记文件系统类型,如 ext4 或 tmpfs。
  • s_root:文件系统根目录的 dentry(目录项)结构。
  • s_inodes:链接管理该文件系统中所有 inode,便于统一管理。
  • s_mounts:管理多个挂载点实例,便于快速定位和维护挂载状态。
  • s_flags:挂载属性标记,例如只读(RO)或读写(RW)等。
  • s_op:管理超级块的方法集,例如 inode 的创建、删除、同步和清理操作。
  • s_fs_info:不同文件系统专有信息,例如 ext4 的 journal 日志数据结构。
🚩 super_block 在挂载过程中的作用示例:
// 以ext4文件系统为例
static struct file_system_type ext4_fs_type = {
    .name = "ext4",
    .mount = ext4_mount,
    .kill_sb = kill_block_super,
};

static struct dentry *ext4_mount(struct file_system_type *fs_type, int flags,
                                 const char *dev_name, void *data)
{
    return mount_bdev(fs_type, flags, dev_name, data, ext4_fill_super);
}

// ext4_fill_super 的实现示例
static int ext4_fill_super(struct super_block *sb, void *data, int silent)
{
    struct inode *root_inode;
    ...
    root_inode = ext4_iget(sb, EXT4_ROOT_INO);
    sb->s_root = d_make_root(root_inode);
    ...
    sb->s_fs_info = ext4_fs_info_alloc(); //分配ext4专有数据
    sb->s_op = &ext4_super_ops;           //设置操作函数集
    ...
}

🚦 三、挂载流程图示(以 ext4 为例)

mount("ext4", "/mnt", "ext4", ...)  
→ do_mount() 
→ vfs_kern_mount() 
→ ext4_mount()
→ ext4_fill_super()
→ 设置super_block, dentry, inode等

🔗 四、系统调用如何经过 VFS

以 open 为例:

sys_open()
→ do_sys_open()
→ vfs_open()
→ dentry_open()
→ file->f_op->open()

📚 五、推荐演示示例:使用 debugfs

static struct dentry *dir;
static u32 debug_val;

static int __init debug_init(void) {
    dir = debugfs_create_dir("demo", NULL);
    debugfs_create_u32("value", 0644, dir, &debug_val);
    return 0;
}
module_init(debug_init);

访问路径:/sys/kernel/debug/demo/value


🎯 六、总结

模块建议
视频制作详细解释super_block的作用与流程
博文撰写深入解释核心结构与挂载流程
面试答题熟悉三层架构与核心结构体关系

🎥 更多详细讲解访问 B 站视频Linux 文件系统子系统:三层架构全面掌握

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值