加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

Linux 的虚拟文件系统(真正理解“一切皆文件”)

发布时间:2019-06-15 02:34:50 所属栏目:站长百科 来源:cpp软件架构狮
导读:1,弁言 Linux 中应承浩瀚差异的文件体系共存,如 ext2, ext3, vfat 等。通过行使统一套文件 I/O 体系 挪用即可对 Linux 中的恣意文件举办操纵而无需思量其地址的详细文件体系名目;更进一步,对文件的 操纵可以跨文件体系而执行。如图 1 所示,我们可以使

如图5所示,被Linux支持的文件体系,都有且仅有一个file_system_type布局而不管它有零个或多个实例被安装到体系 中。每安装一个文件体系,就对应有一个超等块和安装点。超等块通过它的一个域s_type指向其对应的详细的文件体系范例。详细的 文件体系通过file_system_type中的一个域fs_supers链接具有统一种文件范例的超等块。统一种文件体系范例的超等块通过域s_instances链 接。

图5. 超等块、安装点和详细的文件体系的相关

Linux 的假造文件体系(真正领略“统统皆文件”)

从图6可知:历程通过task_struct中的一个域files_struct files来相识它当前所打开的文件工具;而我们凡是所说的文件 描写符着实是历程打开的文件工具数组的索引值。文件工具通过域f_dentry找到它对应的dentry工具,再由dentry工具的域d_inode找 到它对应的索引结点,这样就成立了文件工具与现实的物理文件的关联。最后,尚有一点很重要的是, 文件工具所对应的文件操纵函数 列表是通过索引结点的域i_fop获得的。图6对第三部门源码的领略起到很大的浸染。

图6. 历程与超等块、文件、索引结点、目次项的相关

Linux 的假造文件体系(真正领略“统统皆文件”)

3 基于VFS的文件I/O

到今朝为止,文章首要都是从理论上来报告VFS的运行机制;接下来我们将深入源代码层中,通过叙述两个具有代表性的体系 挪用sys_open()和sys_read()来更好地领略VFS向详细文件体系提供的接口机制。因为本文更存眷的是文件操纵的整个流程体制,以是我 们在追踪源代码时,对一些细节性的处理赏罚不予体谅。又因为篇幅所限,只列出相干代码。本文中的源代码来自于linux-2.6.17内核版本。

在深入sys_open()和sys_read()之前,我们先概览下挪用sys_read()的上下文。图7描写了从用户空间的read()挪用到数据从 磁盘读出的整个流程。当在用户应用措施挪用文件I/O read()操纵时,体系挪用sys_read()被引发,sys_read()找到文件地址的详细文件 体系,把节制权传给该文件体系,最后由详细文件体系与物理介质交互,从介质中读出数据。

图7. 从物理介质读数据的进程

Linux 的假造文件体系(真正领略“统统皆文件”)

3.1 sys_open()

sys_open()体系挪用打开或建设一个文件,乐成返回该文件的文件描写符。图8是sys_open()实当代码中首要的函数挪用相关图。

图8. sys_open函数挪用相关图

Linux 的假造文件体系(真正领略“统统皆文件”)

因为sys_open()的代码量大,函数挪用相关伟大,以下首要是对该函数做整体的理会;而对个中的一些要害点,则列出其要害代码。

a. 从sys_open()的函数挪用相关图可以看到,sys_open()在做了一些简朴的参数检讨后,就把接力棒传给do_sys_open():

1)、起首,get_unused_fd()获得一个可用的文件描写符;通过该函数,可知文件描写符实质是历程打开文件列表中对应某个文件工具的索引值;

2)、接着,do_filp_open()打开文件,返回一个file工具,代表由该历程打开的一个文件;历程通过这样的一个数据布局对物理文件举办读写操纵。

3)、最后,fd_install()成立文件描写符与file工具的接洽,往后历程对文件的读写都是通过哄骗该文件描写符而举办。

b. do_filp_open()用于打开文件,返回一个file工具;而打开之前必要先找到该文件:

1)、open_namei()用于按照文件路径名查找文件,借助一个持有路径信息的数据布局nameidata而举办;

2)、查找竣事后将添补有路径信息的nameidata返回给接下来的函数nameidata_to_filp()从而获得最终的file工具;当到达目标后,nameidata这个数据布局将会顿时被开释。

c.open_namei()用于查找一个文件:

1)、path_lookup_open()实现文件的查找成果;要打开的文件若不存在,还必要有一个新建的进程,则挪用 path_lookup_create(),后者和前者封装的是统一个现实的路径查找函数,只是参数纷歧样,使它们在处理赏罚细节上有所毛病;

2)、当是以新建文件的方法打开文件时,即配置了O_CREAT标识时必要建设一个新的索引节点,代表建设一个文件。在vfs_create()里的一句 焦点语句dir->i_op->create(dir, dentry, mode, nd)可知它挪用了详细的文件体系所提供的建设索引节点的要领。留意:这边的索引节点的观念,还只是位于内存之中,它和磁盘上的物理的索引节点的相关就像 位于内存中和位于磁盘中的文件一样。此时新建的索引节点还不能完全符号一个物理文件的乐成建设,只有当把索引节点回写到磁盘上才是一个物理文件的真正创 建。想想我们以新建的方法打开一个文件,对其读写但最终没有生涯而封锁,则位于内存中的索引节点会经验重新建到消散的进程,而磁盘却始终不知道有人曾经想 过建设一个文件,这是由于索引节点没有回写的缘故。

3)、path_to_nameidata()添补nameidata数据布局;

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读