[IO系统]03 虚拟文件系统(VFS)

         VFS:Virtual FileSystem虚拟文件系统,或Virtual File Switch虚拟文件转换。

1.1   VFS的作用

         VFS是Linux和UNIX文件系统中采用的一种技术机制,旨在一个操作系统中支持多个不同类型的文件系统。VFS是操作系统内核中这样一组数据结构与子程序的集合,它位于操作系统系统调用界面与具体类型文件系统之间,负责记录操作系统中可以支持和已经安装有哪些文件系统类型,将相关系统调用转换为对具体类型文件系统的调用,
负责不同类型文件系统间的协同工作(例如跨FS复制),实现对不同类型文件系统的动态装卸和可扩充性等。

         例如,假设一个用户输入以下shell命令:

$ cp /floppy/TEST/tmp/test

         其中/floppy是MS-DOS磁盘的一个安装点,而/tmp是一个标准的第二扩展文件系统(second ExtendedFilesystom, Ext2)的目录。正如图(a)所示,VFS是用户的应用程序与文件系统实现之间的抽象层。因此,cp程序并不需要知道/floppy/TEST 和 /tmp/test是什么文件系统类型。相反,cp程序直接与VFS交互,这是通过Unix程序设计人员都熟悉的普通系统调用来进行的。cp的执行代码如图(b)所示:

         它的主要设计思想有以下三点:

         (1)应用层:VFS模型源于UNIX文件系统,使得用户可以直接使用标准UNIX文件系统调用来操作文件,无需考虑具体文件系统特性和物理存储介质,通过VFS访问文件系统,才使得不同文件系统之间的协作性和通用性成为可能。

         (2)虚拟层:在对所有具体文件系统的共同特性进行抽象的基础上,形成一个与具体文件系统实现无关的虚拟层,并在此层次上定义与用户的一致性接口。

         (3)实现层:该层使用类似开关表技术进行具体文件系统转接,实现各种文件系统的物理操作细节,每个文件系统是自包含的,包含文件系统实现的各种设施,如超级块、节点区、数据区以及各种数据结构和文件类的操作函数。

         一般地说,VFS提供以下功能:

         记录可用的文件系统类型;

         把文件系统与对应的存储设备联系起来;

         处理面向文件的通用操作;

         涉及具体文件系统的操作时,把它们映射到相关的具体文件系统。

         VFS抽象层之所以能衔接各种不同的文件系统,是因为它定义了所有文件系统都支持的基本抽象接口和数据结构,同时具体的文件系统也将自己的诸如“文件如何打开”、“目录如何定义”等概念在形式上与VFS的定义保持一致。对于像FAT和NTFS这类非UNIX风格文件系统,必须经过封装,提供符合VFS概念的接口。比如,一个文件系统不支持inode概念,它也必须在内存中装配inode结构体,就像它本身包含inode一样。这些装配和转换需要在使用现场引入特别处理,使得非UNIX文件系统能够兼容UNIX文件系统的使用规则和满足VFS的需求,这样一来,非UNIX文件系统便可与VFS一道工作,只是性能上会有少许影响。

 

1.2   VFS的数据结构

         文件系统中主要有四种数据结构,分别是超级块对象(superblock)、索引节点对象(inode)、目录项对象(dentry )和文件对象(file)。

         超级块对象(super_block):存储一个已安装的文件系统的控制信息(文件系统的状态、文件系统类型、块大小、区块数、索引节点数、脏标志、操作方法),它代表一个已安装的文件系统;每次一个实际的文件系统被安装时,内核会从磁盘的特定位置(磁盘的超级块位置)读取一些控制信息来填充内存中的超级块对象。

         索引节点对象(inode):存储了文件和目录的相关信息(和文件本身是两个不同的概念。它包含的是诸如文件的大小、拥有者、创建时间、磁盘位置、文件操作方法、脏标示等和文件相关的信息),代表一个实质的文件,在磁盘保存有该对象。当一个文件首次被访问时,内核会在内存中组装相应的索引节点对象,以便向内核提供对一个文件进行操作时所必需的全部信息。

         目录项对象(dentry):它代表一个目录项(包括该目录对象对应的索引节点,子目录链表,父目录目录项对象,与它同级的目录的目录项对象链表,使用计数,缓存标志),是路径的一个组成部分(注:路径中的每个组成部分都由一个索引节点对象表示)。该对象只存放在内存中。

         文件对象(file):是已打开的文件在内存中的表示(包括相应的目录项对象、使用计数、访问模式、当前偏移量、操作方法等),主要用于建立进程和磁盘上的文件的对应关系。它由sys_open() 现场创建。

         当三个不同的进程打开相同的文件时,其中两个使用相同路径,如下图所示。


      进程与file、dentry,inode,super_block的关系

         这种情况下, 三个进程都拥有自己的file对象,其中两个使用相同路径的共用一个dentry对象,这两个dentry对象指向同一个inode对象,对应唯一的一个超级块对象,和同一个磁盘文件。

         其他主要的数据结构还有:

         file_system_type:用于描述具体的文件系统的类型信息,所以被Linux支持的文件系统,都有且仅有一个file_system_type结构而不管它有零个或多个实例被安装到系统中。如ext2,ext3,NFS。

         安装点(vfsmount):当一个文件系统被实际安装,就有一个vfsmount结构体被创建,这个结构体对应一个安装点。与超级块一样(即与超级块是一一对应的),但没有存放在磁盘中。它包括安装点的相关信息,如位置和安装标志等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YoungerChina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值