🎥 对应 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 文件系统子系统:三层架构全面掌握