Linux虚拟文件系统支持的文件系统可以划分为三种主要的类型:
磁盘文件系统
这些文件系统管理在本地磁盘分区中可用的磁盘空间或者其他可以起到磁盘作用的设备(比如说一个USB闪存)。
网络文件系统
这些文件系统允许访问属于其他网络计算机的文件系统所包含的文件。
特殊文件系统
这些文件系统不管理本地或者远程磁盘空间
通用文件模型
虚拟文件系统所隐含的主要思想是引入一个通用的文件模型,这个模型可以支持所有的文件系统类型。
下图为VFS在系统中所处的位置。
可以把这里的通用文件模型看作是面型对象的。在这里,对象是一个软件结构,其中定义了数据结构也定义了其上的操作方法。处于效率上的考虑,Linux的编码并为采用面向对象的程序设计(比如C++编程)。因此对象作为普通的C数据结构来实现,数据结构中指向函数的字段就对应于对象的方法。
VFS与进程关系
进程描述符中与VFS相关的部分:
通用文件系统模型与进程关系架构
通用文件系统模型数据结构组成
通用文件系统模型由下列对象组成:
超级块对象
存放已安装文件系统的有关信息。对基于磁盘的文件系统,这类对象通常对应于存放在磁盘上的文件系统控制块。
索引节点对象
存放关于具体文件的一些信息。对于磁盘文件系统,这类对象通常对应与存放在磁盘上的文件控制块。每个索引节点对象都对应与一个索引节点号,这个节点号唯一标识了文件系统上的文件。
文件对象
存放打开文件与进程之间进行交互的有关信息。这类信息仅当进程访问文件期间存放于内核内存中。
目录项对象
存放目录项(也就是文件的特定名称)与对应文件进行链接的有关信息。每个磁盘文件系统都以自己特有的方式将该类信息存放在磁盘上。
挂接点结构
每个已经挂装的文件系统用挂接点对象结构vfsmout描述,所有的结构vfsmount实例形成了一个链表,用全局变量vfsmntlist指向链表头,该链表可称为已挂接文件系统链表。Linux支持一个文件系统挂接多次,但他们仅有一个超级块,每个挂接点用挂接点结构vfsmount描述。
挂接点对象分类连接成不同的链表。
命名空间结构
每个进程可以拥有属于自己的已挂接文件系统树,称为命名空间。通常大多数进程共享一个文件系统命名空间,即系统的根文件系统。命名空间被子进程继承,但如果系统调用clone()用标示CLONE_NEWNS创建一个新进程时,那么新进程将获得一个新命名空间。
进程挂接或卸载文件系统时,仅修改它的命名空间,在同一命名空间的进程才可见这些修改,修改对其他命名空间没有影响。
文件系统类型结构
Linux内核支持多种文件系统,各个文件系统可以作为内核模块或者作为内核一部分进行编译,linux内核使用文件系统类型结构file_system_type对各种文件系统进行跟踪。
文件系统注册后,不同类型的文件系统存放在全局变量的链表file_systems中,同一类型的多个文件系统将超级块链表到结构file_system_type的成员fs_supers上,通过全局变量file_systems,可以找到文件系统类型结构,从该结构可以找到方法(*get_sb)()获取文件系统的超级块,也就可以访问该文件系统了。
VFS数据结构关系
下面给个数据结构之间总的关系:
系统支持的文件系统类型挂接在文件系统类型链表file_systems中,已挂接的文件系统放在挂接点对象链表vfsmntlist中,已挂接的不同类型的文件系统的超级块放在超级块链表super_block中。
虚拟文件系统除了为所有文件系统的实现提供一个通用的接口外,还具有另一个与系统性能相关的重要作用。最近最常使用的目录项对象被放在所谓的目录项高速缓存的磁盘高速缓存中,以加速从文件路径名到最后一个路径分量的索引节点的转换过程。
一般来说,磁盘高速缓存属于软件机制,他允许内核将原本存在磁盘上的某些信息保存在RAM中,以便对这些数据的进一步访问能快速进行。而不必慢速访问磁盘本身。
磁盘高速缓存不同于硬件高速缓存和内存高速缓存,后者都与磁盘和其他设备无关,硬件高速缓存是一个快速静态RAM,他加快了直接对慢速动态RAM的请求。内存高速缓存是一种软件机制,引入他是为了绕过内存分配器。
除了目录项高速缓存和索引节点高速缓存以外,Linux还使用其他磁盘高速缓存。其中最重要的一个是页面高速缓存。(后面会总结到)
VFS是应用程序和具体文件系统之间一层。不过,在某些情况下,一个文件操作可能由VFS本身执行,无需调用底层函数。
版权声明:本文为博主原创文章,未经博主允许不得转载。