当前位置: 首页 > news >正文

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;         // 对应的 inodestruct 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链表头,管理所有inodestruct 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 文件系统子系统:三层架构全面掌握

http://www.lryc.cn/news/588595.html

相关文章:

  • JAVA学习笔记 使用notepad++开发JAVA-003
  • 微信小程序进度条cavans
  • 虚拟主机CPU占用100导致打不开的一次处理
  • [数据结构]#3 循环链表/双向链表
  • 微信小程序未登录状态下的导航拦截有哪些方法可以实现
  • 暑假Python基础整理 --异常处理及程序调试
  • python原生处理properties文件
  • 电动汽车制动系统及其工作原理
  • slam中的eskf观测矩阵推导
  • LangChain智能体开发实战:从零构建企业级AI助手
  • C++ Boost Aiso TCP 网络聊天(服务端客户端一体化)
  • CMake基础:覆盖项目开发的五大配套工具
  • 【机器学习深度学习】大模型推理速度与私有化部署的价值分析
  • ELK部署与使用详解
  • Docker部署语音转文字(STT)服务并接入Home Assistant
  • Dubbo高阶难题:异步转同步调用链上全局透传参数的丢失问题
  • 设备发出、接收数据帧的工作机制
  • HarmonyOS从入门到精通:动画设计与实现之九 - 实用动画案例详解(上)
  • HarmonyOS从入门到精通:动画设计与实现之九 - 实用动画案例详解(下)
  • 暑假Python基础整理 -- 文件及目录操作
  • keepalive模拟操作部署
  • 2025-7-14-C++ 学习 排序(2)
  • IoC容器深度解析:架构、原理与实现
  • 驱动开发系列60- Vulkan 驱动实现-SPIRV到HW指令的实现过程(1)
  • 分支战略论:Git版本森林中的生存法则
  • PHP password_verify() 函数
  • 什么是微服务?-核心思想:化整为零,各自为战
  • Node.js + Express的数据库AB View切换方案设计
  • 【EM算法】三硬币模型
  • 自动微分模块