从文件 IO 看 Linux 的虚拟文件系统Word文件下载.docx
- 文档编号:15891544
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:18
- 大小:444.43KB
从文件 IO 看 Linux 的虚拟文件系统Word文件下载.docx
《从文件 IO 看 Linux 的虚拟文件系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《从文件 IO 看 Linux 的虚拟文件系统Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
不仅普通的文件,目录、字符设备、块设备、套接字等在Unix/Linux中都是以文件被对待;
它们虽然类型不同,但是对其提供的却是同一套操作界面。
图2.一切皆是文件
而虚拟文件系统正是实现上述两点Linux特性的关键所在。
虚拟文件系统(VirtualFileSystem,简称VFS),是Linux内核中的一个软件层,用于给用户空间的程序提供文件系统接口;
同时,它也提供了内核中的一个抽象功能,允许不同的文件系统共存。
系统中所有的文件系统不但依赖VFS共存,而且也依靠VFS协同工作。
为了能够支持各种实际文件系统,VFS定义了所有文件系统都支持的基本的、概念上的接口和数据结构;
同时实际文件系统也提供VFS所期望的抽象接口和数据结构,将自身的诸如文件、目录等概念在形式上与VFS的定义保持一致。
换句话说,一个实际的文件系统想要被Linux支持,就必须提供一个符合VFS标准的接口,才能与VFS协同工作。
实际文件系统在统一的接口和数据结构下隐藏了具体的实现细节,所以在VFS层和内核的其他部分看来,所有文件系统都是相同的。
图3显示了VFS在内核中与实际的文件系统的协同关系。
图3.VFS在内核中与其他的内核模块的协同关系
我们已经知道,正是由于在内核中引入了VFS,跨文件系统的文件操作才能实现,“一切皆是文件”的口号才能承诺。
而为什么引入了VFS,就能实现这两个特性呢?
在接下来,我们将以这样的一个思路来切入文章的正题:
我们将先简要介绍下用以描述VFS模型的一些数据结构,总结出这些数据结构相互间的关系;
然后选择两个具有代表性的文件I/O操作sys_open()和sys_read()来详细说明内核是如何借助VFS和具体的文件系统打交道以实现跨文件系统的文件操作和承诺“一切皆是文件”的口号。
2VFS数据结构
2.1一些基本概念
从本质上讲,文件系统是特殊的数据分层存储结构,它包含文件、目录和相关的控制信息。
为了描述这个结构,Linux引入了一些基本概念:
文件一组在逻辑上具有完整意义的信息项的系列。
在Linux中,除了普通文件,其他诸如目录、设备、套接字等也以文件被对待。
总之,“一切皆文件”。
目录目录好比一个文件夹,用来容纳相关文件。
因为目录可以包含子目录,所以目录是可以层层嵌套,形成文件路径。
在Linux中,目录也是以一种特殊文件被对待的,所以用于文件的操作同样也可以用在目录上。
目录项在一个文件路径中,路径中的每一部分都被称为目录项;
如路径/home/source/helloworld.c中,目录/,home,source和文件helloworld.c都是一个目录项。
索引节点用于存储文件的元数据的一个数据结构。
文件的元数据,也就是文件的相关信息,和文件本身是两个不同的概念。
它包含的是诸如文件的大小、拥有者、创建时间、磁盘位置等和文件相关的信息。
超级块用于存储文件系统的控制信息的数据结构。
描述文件系统的状态、文件系统类型、大小、区块数、索引节点数等,存放于磁盘的特定扇区中。
如上的几个概念在磁盘中的位置关系如图4所示。
图4.磁盘与文件系统
关于文件系统的三个易混淆的概念:
创建以某种方式格式化磁盘的过程就是在其之上建立一个文件系统的过程。
创建文现系统时,会在磁盘的特定位置写入关于该文件系统的控制信息。
注册向内核报到,声明自己能被内核支持。
一般在编译内核的时侯注册;
也可以加载模块的方式手动注册。
注册过程实际上是将表示各实际文件系统的数据结构structfile_system_type实例化。
安装也就是我们熟悉的mount操作,将文件系统加入到Linux的根文件系统的目录树结构上;
这样文件系统才能被访问。
2.2VFS数据结构
VFS依靠四个主要的数据结构和一些辅助的数据结构来描述其结构信息,这些数据结构表现得就像是对象;
每个主要对象中都包含由操作函数表构成的操作对象,这些操作对象描述了内核针对这几个主要的对象可以进行的操作。
2.2.1超级块对象
存储一个已安装的文件系统的控制信息,代表一个已安装的文件系统;
每次一个实际的文件系统被安装时,内核会从磁盘的特定位置读取一些控制信息来填充内存中的超级块对象。
一个安装实例和一个超级块对象一一对应。
超级块通过其结构中的一个域s_type记录它所属的文件系统类型。
根据第三部分追踪源代码的需要,以下是对该超级块结构的部分相关成员域的描述,(如下同):
清单1.超级块
structsuper_block{//超级块数据结构
structlist_heads_list;
/*指向超级块链表的指针*/
……
structfile_system_type*s_type;
/*文件系统类型*/
structsuper_operations*s_op;
/*超级块方法*/
structlist_heads_instances;
/*该类型文件系统*/
};
structsuper_operations{//超级块方法
//该函数在给定的超级块下创建并初始化一个新的索引节点对象
structinode*(*alloc_inode)(structsuper_block*sb);
//该函数从磁盘上读取索引节点,并动态填充内存中对应的索引节点对象的剩余部分
void(*read_inode)(structinode*);
2.2.2索引节点对象
索引节点对象存储了文件的相关信息,代表了存储设备上的一个实际的物理文件。
当一个文件首次被访问时,内核会在内存中组装相应的索引节点对象,以便向内核提供对一个文件进行操作时所必需的全部信息;
这些信息一部分存储在磁盘特定位置,另外一部分是在加载时动态填充的。
清单2.索引节点
structinode{//索引节点结构
structinode_operations*i_op;
/*索引节点操作表*/
structfile_operations*i_fop;
/*该索引节点对应文件的文件操作集*/
structsuper_block*i_sb;
/*相关的超级块*/
structinode_operations{//索引节点方法
//该函数为dentry对象所对应的文件创建一个新的索引节点,主要是由open()系统调用来调用
int(*create)(structinode*,structdentry*,int,structnameidata*);
//在特定目录中寻找dentry对象所对应的索引节点
structdentry*(*lookup)(structinode*,structdentry*,structnameidata*);
2.2.3目录项对象
引入目录项的概念主要是出于方便查找文件的目的。
一个路径的各个组成部分,不管是目录还是普通的文件,都是一个目录项对象。
如,在路径/home/source/test.c中,目录/,home,source和文件test.c都对应一个目录项对象。
不同于前面的两个对象,目录项对象没有对应的磁盘数据结构,VFS在遍历路径名的过程中现场将它们逐个地解析成目录项对象。
清单3.目录项
structdentry{//目录项结构
structinode*d_inode;
/*相关的索引节点*/
structdentry*d_parent;
/*父目录的目录项对象*/
structqstrd_name;
/*目录项的名字*/
structlist_headd_subdirs;
/*子目录*/
structdentry_operations*d_op;
/*目录项操作表*/
structsuper_block*d_sb;
/*文件超级块*/
structdentry_operations{
//判断目录项是否有效;
int(*d_revalidate)(structdentry*,structnameidata*);
//为目录项生成散列值;
int(*d_hash)(structdentry*,structqstr*);
2.2.4文件对象
文件对象是已打开的文件在内存中的表示,主要用于建立进程和磁盘上的文件的对应关系。
它由sys_open()现场创建,由sys_close()销毁。
文件对象和物理文件的关系有点像进程和程序的关系一样。
当我们站在用户空间来看待VFS,我们像是只需与文件对象打交道,而无须关心超级块,索引节点或目录项。
因为多个进程可以同时打开和操作同一个文件,所以同一个文件也可能存在多个对应的文件对象。
文件对象仅仅在进程观点上代表已经打开的文件,它反过来指向目录项对象(反过来指向索引节点)。
一个文件对应的文件对象可能不是惟一的,但是其对应的索引节点和目录项对象无疑是惟一的。
清单4.文件对象
structfile{
structlist_headf_list;
/*文件对象链表*/
structdentry*f_dentry;
/*相关目录项对象*/
structvfsmount*f_vfsmnt;
/*相关的安装文件系统*/
structfile_operations*f_op;
/*文件操作表*/
structfile_operations{
//文件读操作
ssize_t(*read)(structfile*,char__user*,size_t,loff_t*);
//文件写操作
ssize_t(*write)(structfile*,constchar__user*,size_t,loff_t*);
int(*read
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 从文件 IO Linux 的虚拟文件系统 文件 虚拟 文件系统
![提示](https://static.bdocx.com/images/bang_tan.gif)