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

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


📖 推荐阅读:《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 最大区别是什么?

项目ext4tmpfs
类型持久化文件系统内存文件系统
存储介质块设备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


http://www.dtcms.com/a/271925.html

相关文章:

  • Redis持久化机制深度解析:数据安全的双保险
  • 机器学习12——支持向量机中
  • ElementUI:高效优雅的Vue.js组件库
  • Rust 简介
  • 工厂的神经进化—工业智能体重塑制造本质的技术革命与文明挑战
  • 【Linux】Rocky Linux 清华镜像源安装 GitLab
  • IT运维:远程协助工具TrustViewer,简单好用,免费用不受限制
  • Qt 信号槽的扩展知识
  • libimagequant 在 mac 平台编译双架构
  • 在 Mac 上安装 Java 和 IntelliJ IDEA(完整笔记)
  • CMD,PowerShell、Linux/MAC设置环境变量
  • MacOS 终端(Terminal)配置显示日期时间
  • 政安晨【开源人工智能硬件】【ESP乐鑫篇】 —— 在macOS上部署工具开发环境(小资的非开发者用苹果系统也可以玩乐鑫)
  • Canny边缘检测(cv2.Canny())
  • Mac自定义右键功能
  • 如何在Linux上搭建本地Docker Registry并实现远程连接
  • 【TCP/IP】6. 差错与控制报文协议
  • Rust Web 全栈开发(四):构建 REST API
  • llvm, polly, 向量化测试,GEMM非常明显
  • ValueConverter转换器WPF
  • Leetcode力扣解题记录--第42题 接雨水(动规和分治法)
  • 开源 Arkts 鸿蒙应用 开发(六)数据持久--文件和首选项存储
  • [特殊字符] LLM(大型语言模型):智能时代的语言引擎与通用推理基座
  • 藏文识别技术的关键挑战与解决方案
  • 使用Visual Studio Code附加到Jetty进程调试Servlet
  • 小皮面板搭建pikachu靶场
  • 710 Mybatis实战
  • Go语言中map的零值是什么?对零值map进行读写操作会发生什么?如何正确初始化和使用map?
  • 力扣-73.矩阵置零
  • 【会员专享数据】2013-2024年我国省市县三级逐年SO₂数值数据(Shp/Excel格式)