目录
一:参考资料
二:整理的原因及基本原则
三:Linux文件系统大蓝图
四:补充说明
一:参考资料
博主梳理的关于文件系统的基础知识:
7.5 文件系统_定义_龙赤子的博客-CSDN博客
博主转载的关于page cache与buffer cache关系的博文:
Linux内核Page Cache和Buffer Cache关系及演化历史_龙赤子的博客-CSDN博客
博主整理的关于Linux内存大蓝图的结构:
学内核之十六:linux内存管理结构大蓝图_linux内存管理框架图_龙赤子的博客-CSDN博客
博主找打的关于Linux层次关系比较好的博文:
https://www.cnblogs.com/pwl999/p/15534976.html
其他网络资料不再一一列出。
二:整理的原因及基本原则
1 相对于文字描述,图形的表达力更强,俗话说一图胜千言。
2 内核的复杂结构,导致文字描述的内容容易遗忘,图形则因为适合大脑记忆的结构,可以辅助理解重要信息,在重要的推演过程中,助人一臂之力。
3 文件系统各个结构体的关系并不是简单的一对一或者我指向你,你指向他,而是我中有你,你中有我,相互直接或者间接的达成关系链。所以,不需要严格或者死记这些关系,只需要大概理清各个结构代表的什么,基本上也就根据逻辑推出它们之间是否有联系。如果实际中不好确定或者需要明确时,再查找确认也来得及。
4 当前整理的结构类型、内容、关系基于2.6内核,基于linux内核设计与实现这本书。现在内核的结构可能增减或者有其他方面的变化,但是根本的东西是不变的,所以倒不必太在意,因为目的是构建文件系统关系概念,而非细抠具体的实现。
5 结合具体的使用场景来辅助理解这些结构体的作用及其关系的特点。比如,文件系统、文件系统的挂载、文件的创建、修改、删除等。还有文件系统与其他子系统的关系等。
整体上我们会看到数据结构之间的关系错综复杂,其实如上所述,不需要纠结于细节,整体把握即可。
三:Linux文件系统大蓝图
基于上面五条原则,整理出结构体关系。仅供参考。如下图:
四:补充说明
部分细节补充说明如下:
1 open系统调用会创建file结构对象。可能会创建一个新文件,或者打开已有文件。
2 可能多个file对象对应一个实际文件,比如多次打开的情况
3 目录项表示实际打开的文件,是唯一的
4 file对象不对应具体磁盘数据,没有相关域。通过目录项和iNode找到具体的物理磁盘数据。
5 但是目录项也没有对应的磁盘数据结构,所以,这本质上是一个辅助结构,根据路径创建。
6 索引节点有磁盘对应的结构。索引节点也可以表示设备或管道等特殊文件。
7 梳理线路
进程角度,存在任务结构体task_struct,其中包含了当前进程的根目录,挂载点等信息,关联mnt_namespace结构,包含当前进程打开的文件信息,关联files_struct结构,包含文件系统信息,关联fs_struct结构。
Fs_struct结构包含根路径,关联path结构。
Mnt命名空间包含挂载点信息,关联vfs mount结构
Path结构的挂载点信息也指向vfs mount结构
通过path的dentry结构,可以找到超级块结构,从超级块出发,可以获取文件系统和磁盘相关的映射信息。
Files struct包含file结构,通过file结构,可以找到file_path结构,通过file_path结构,回到上面的路径关系。通过file结构,也可以找到address_space结构。
通过address_space结构,建立文件和磁盘的映射关系,即通过page cache与bufferhead建立关系。
这样,从当前进程信息就可以获取当前进程相关的文件系统及其关联磁盘信息。
注意,这里挂载和文件都是以树结构来组织的,也就是可以存在多个实例。任务如果是独立创建的,则可以有自己的mnt命名空间。命名空间实现资源的隔离。
另外注意,目录也是一个文件。