文件系统子系统 · 核心问题问答精要


推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
更多学习视频请关注 B 站:嵌入式Jerry



文件系统子系统 · 核心问题问答精要

本文聚焦于 Linux 文件系统子系统中最常见、最具代表性的问题,涵盖从总体架构到关键结构体、再到实际实现与接口调用等方面。配合你构建的学习目录结构,形成有重点的掌握路径。


一、总体架构理解类

❓1. Linux 文件系统的整体结构如何划分?

答:
通常可分为三层结构:

  • 应用层接口:如 open/read/write/ioctl 等系统调用。
  • VFS 抽象层:内核统一接口层,结构体如 file/inode/dentry/vfsmount
  • 具体实现层:ext4、tmpfs、procfs、sysfs 等文件系统,通过 register_filesystem() 接入 VFS。

❓2. /proc/sys 属于真实的文件系统吗?

答:
它们属于 虚拟文件系统

  • /procprocfs,用于展示进程/内存等信息;
  • /syssysfs,展示设备树状结构;
    它们没有落盘数据,不存在真实的块设备,只是在内存中由内核生成。

二、关键结构体与接口理解

❓3. fileinodedentry 的职责分别是什么?

结构体 角色说明
file 表示一次打开的文件,绑定 fd,进程相关
inode 表示实际的文件或目录对象
dentry 表示路径项,是 name → inode 的映射缓存

它们组合构成了文件系统操作的核心三元组。


❓4. 一个文件被打开两次,fileinode 有哪些区别?

答:

  • 每次 open() 都会新建一个 file 结构体;
  • 但多个 file 可以共享同一个 inode
  • file 是**“一次打开的视角”inode“文件本体”**。

三、系统调用与路径解析类

❓5. open() 调用流程中都经过了哪些关键结构?

答:
系统调用 sys_open() 最终会:

  1. 通过 filename_lookup() 查找路径;
  2. 得到 dentry
  3. 拿到 inode
  4. 创建 file 并返回 fd

关键函数如 do_filp_open() 位于 fs/namei.c


❓6. read() 系统调用是如何到达实际驱动的?

答:
read()vfs_read() → 调用 file->f_op->read()
file_operations 是由具体文件系统(如 ext4)或驱动注册提供的。


四、文件系统实现类

❓7. ext4 与 tmpfs 最大区别是什么?

项目 ext4 tmpfs
类型 持久化文件系统 内存文件系统
存储介质 块设备 RAM
使用场景 根文件系统 /tmp/run

❓8. rootfs 和 initramfs 的区别与联系?

答:

  • initramfs启动时挂载的初始根文件系统(内核内嵌的 CPIO 格式);
  • rootfs 是一个逻辑挂载点,通常一开始挂载的是 initramfs
  • 后续会切换成实际的根文件系统(如 ext4)。

五、调试与通知机制类

❓9. 如何监控一个文件是否被修改?

答:
可使用 inotify 或 fanotify 接口:

  • inotify_add_watch() 添加监听;
  • 内核通过 VFS 中的 fsnotify() 分发事件;
  • 用户态使用 read() 等待事件发生。

❓10. procfssysfs 是如何创建节点的?

答:

  • 使用内核 API 如 proc_create() / proc_mkdir() 创建 procfs 节点;
  • 使用 kobject_create_and_add() / device_create_file() 添加 sysfs 节点;
  • 它们背后本质是操作 VFS 中的 dentry/inode 结构体。

✅ 总结建议

建议 说明
优先掌握 VFS 三大结构体 fileinodedentry 是全局核心
结合实现与挂载机制 每种文件系统都有对应的注册、挂载路径
多读 namei.c / fs/*.c 源码 核心逻辑都集中在这里
关注 sysfs/procfs 实战用途 debugfs/sysfs 在驱动调试中经常使用


推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
更多学习视频请关注 B 站:嵌入式Jerry


你可能感兴趣的:(内核+文件系统,java,开发语言)