目录
0.连接之前写的文章
1.虚拟文件系统中对象的引入

虚拟文件系统这几个字中第一个词是虚拟,这就意味着这样的文件系统在磁盘或者其他
存储介质上并没有对应的存储信息,那么一个虚无的文件系统到底是怎样形成的呢?
尽管linux支持多达几十种文件系统,但是这些真实的文件系统并不是一下就都挂在
系统中,它们实际上是按需被挂载的.
老子说:有无相生.这个虚的VFS的信息都来源于实的文件系统,所以VFS必须承载各种
文件系统的共有属性,另外,这些实的文件系统,只有安装到系统中,VFS才予以认可.
也就是说,VFS只管理挂载到系统中的实际文件系统,既然VFS承担管家的角色,那么我们
分析一下它到底要管理哪些对象,linux在文件系统的设计全然汲取了UNIX的设计思想,
UNIX在文件系统中抽象出四个概念:
(1)文件
(2)目录项
(3)索引节点
(4)超级块
2.VFS中共性对象的抽象

(1)超级块对象(superblock):存放系统中与安装文件系统的有关信息;
(2)文件对象(file):存放打开文件与进程之间进行交互的有关信息;
(3)索引节点对象(inode):存放关于具体文件的一般信息;
(4)目录项对象(dentry):文件目录树种一个路径的组成部分,不管是目录还是普通文件,都是一个目录项
对象.
上图给出了对象之间简要的关系图.
3.超级块对象-描述文件系统的属性

超级块对象用来描述文件系统的属性,用来描述整个文件系统的信息,
每个具体的文件系统都有各自的超级块,VFS的超级块是各种具体文件
系统在安装的时候建立的,并在卸载的时候被自动删除(可以执行dtrace mount查看).
其数据结构就是super block.
素有超级块的对象以双向链表的形式连接在一起,与超级块关联的方法
就是超级块操作表,这些操作是由super_operations来描述的.
4.索引节点对象-描述文件属性

索引节点对象存储了文件的相关信息,代表了存储设备上一个的
一个实际的物理文件,当一个文件首次被访问的时候,内核会在内存中
组织相应的索引节点对象,以便向内核提供对一个文件进行操作时所必须的
全部信息,这些信息一部分存储在磁盘特定的位置,另一部分在加载时动态
填充,大家要通过数据结构具体来了解索引节点到底描述了文件的哪些属性.
5.目录项对象-描述文件的路径

有目录项的概念主要出于查找文件为目的,一个路径的各个组成部分,不管是目录还是
一个普通文件都是一个目录项对象.比如说在/home/source/test.c中,
(1)目录:/
(2)目录:/home
(3)目录:/home/source/
(4)文件:/home/source/test.c
它们四个都对应者一个目录项对象,不同于前面的两个对象,目录项对象没有对应的磁盘
数据结构,VFS在遍历路径名的过程中现场将它们逐个解析成目录项对象.
6.文件对象-描述进程打开的文件

从数据结构中可以看出,文件对象是对已经打开的文件在内存中的表示,主要用于建立
进程和磁盘上文件的对应关系,由system_open现场创建,由system_close销毁,文件对
象和物理文件之间的关系有点像进程和程序的关系,当我们站在用户空间看待VFS的时
候,我们只需要与文件对象打交道,而无需关系超级块,索引节点或者目录项,因为多个
进程可以同时打开和操作同一个文件,所以同一个文件也可能存在多个对应的文件对象.
文件对象仅仅在进程观点上代表已经打开的文件,它反过来指向目录项对象,一个文件
对应的文件对象可能不是唯一的,但是其对应的索引节点和目录项对象是唯一的.
7.进程打开文件表-与进程相关的文件结构

8.与进程相关的文件结构

9.数据结构关系图


10.与文件系统相关的数据结构-安装点数据结构

11.超级块,安装点和具体文件系统的关系

12.小结,推荐资源与思考问题



本文深入探讨了Linux虚拟文件系统(VFS)的核心概念及其关键数据结构。介绍了超级块、索引节点、目录项和文件对象等核心组件的作用及相互关系,并解释了VFS如何通过抽象这些对象来统一管理多种文件系统。
7747

被折叠的 条评论
为什么被折叠?



