Linux VFS自顶向下分析.doc_第1页
Linux VFS自顶向下分析.doc_第2页
Linux VFS自顶向下分析.doc_第3页
Linux VFS自顶向下分析.doc_第4页
Linux VFS自顶向下分析.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux VFS(虚拟文件系统)主干分析作者:卓达城职业:学生学校:华南理工大学(本科) 华中科技大学(2010级研究生在读)实验室:集群网络与服务计算实验室主要研究方向:嵌入式虚拟化联系方式:日期:2011年2月17日一、概述 对于VFS(虚拟文件系统,下同)最主要的作用在于设备驱动和文件系统这两块,个人以为,各种大神的书对VFS的分析确实非常透彻,涉及方方面面,但是由于内容太多,所以很难让读者理解VFS的架构,本文主要从文件系统这个方面分析VFS,抓住主干和核心数据结构,意在让读者有一个架构上的理解,至于文件权限等其它问题,这里略过,细节方面的内容请拜读各大Linux神书。二、从VFS到实际文件2.1 存储介质中的核心数据 正如要学习操作系统,就必须知道CPU能做什么一样,要了解VFS跟实际文件的关系,就必须知道实际存储介质里面到底放的什么数据,VFS会用到哪些数据。存储介质里面主要放着两种数据,SuperBlock(超级块)和Inode(文件节点),VFS通过这两种数据就可以得到真实的文件内容。2.2 VFS到实际文件的过程从VFS到实际文件要经过以下过程:第一步:VFS(我们平时用的read,write等函数,直观点就是双击文件夹,或者双击文件,再直观点就是双击usb的图标)。第二步:具体文件系统对应的函数,VFS中的read(下面会以read为具体例子)指向具体文件系统的read。第三部:调用存储介质的驱动程序读取真正的内容。如下图:2.3 从mount开始 这里略过驱动程序,内核启动之后,假设我们的存储介质(例如硬盘、SD卡等存储介质)的驱动已经加载完成,并且/dev/block0已经存在。如果我们需要访问存储介质里面的文件,我们一般要先使用mount命令。mount命令对应的函数如下:int mount(const char *source, const char *target, const char *filesystemtype, unsigned long mountflags, const void *data);其中source是源设备(上面的/dev/block0),target为目标设备,filesystemtype为文件系统的名字,后面两个参数忽略,要想进一步了解请参阅Linux各大神书,这里为了简单忽略掉。Mount函数是一个系统调用,它的流程如下:Mount - sys_mount - do_mount - do_kern_mountMount的主要作用为帮助虚拟文件系统选择合适的路径(姑且这么说),下面以图说明问题:第一步:内核启动以后,VFS挂载了多个文件系统,文件系统的数据结构的名称为file_system_type ,这些数据结构以链表连起来。这里我们可以这样理解/dev/block0就是硬件+驱动(SD卡+驱动),而file_system_type结构对应的就是FAT32等文件系统,这些文件系统大部分都在内核中实现了。第二步:运行mount /dev/block0 TEMP EXT4(为了简单,只写这么多,其中TEMP为在虚拟文件系统上建立的文件夹)以后,TEMP文件夹就与相关的文件系统和硬件设备关联起来。Mount之后,上层应用程序对TEMP文件夹的操作就会保存到存储介质(上图的硬盘)上。2.4 File_system_type结构(特定文件系统必须实现其成员函数get_sb)File_system_type结构成员不多,我们仅解析它的两个个成员:成员name就是文件系统的名字,用于搜索配对。Get_sb函数的作用为在存储介质中获得super_block的实际内容,并且初始化super_block结构。在内核启动的过程中,会调用函数register_filesystem把file_system_type结构挂到相应的链表(暂时称之为表1)上去。2.5 Mount函数两步走Mount函数第一步是搜索文件系统链表(flie_system_type组成的链表,上面提到的表1),如果找到(可以简单的理解为通过name成员查找),则调用其中的get_sb函数,建立一个super_block结构,否则会去查找文件系统模块,有则加载,无则失败。第二步是根据得到的super_block建立vfsmount结构(该结构是文件夹和实际文件系统的桥梁,按照上面所说的就是TEMP和EXT4的桥梁),然后以TEMP为键值,把vfsmount加入hash表中(该hash表用于搜索文件夹对应的vfsmount,暂时称之为表2)。2.6 Dentry结构Dentry结构对应VFS的一个目录,例如这里的TEMP就对应一个Dentry结构。成员很多,但是为了简单,只解析两个字段。其中d_inode为该文件夹对应的inode(文件夹也是一个文件),d_mounted表示有多少个文件系统mount到这个文件夹上。这个桥梁的作用流程如下:当路径查找函数打开该文件夹的时候(例如上面所说的TEMP),一般是path_lookup - .-d_mountpoint,VFS首先会判断d_mounted是否为零,如果非零,就根据文件夹,从hash表(上面提到的表2)中搜索该文件夹对应的文件系统。搜索的函数流程为:_follow_down(一般在d_mountpoint后就会调用)- lookup_mnt。Lookup_mnt函数根据TEMP-vfsmount的hash表进行搜索,搜索成功则返回vfsmount,VFS根据vfsmount调用进行特定文件系统的操作。2.5 Vfsmount结构Vfsmount结构不算大,但是为了更好的理解,我们仅需要两个成员:其中mnt_sb为超级块,当mount完成之后,mnt_sb指向特定的文件系统,例如加载的是ext2文件系统,那么mnt_sb就会指向ext2_sb_info,也就是说如果自己写一个文件系统,那必须定义一个。而mnt_devname为设备名称,也就是上面提到的/dev/block0(可以简单的理解为硬件+驱动)。2.6 Super_block结构(特定文件系统必须实现该结构的子集)Super_block结构相当庞大,但是我们为了简单,只涉及两个成员:其中s_magic为魔数,正如2.1所说的,要写回存储介质,s_op成员是关键,它包括read_inode和write_inode等函数,这些函数中的部分都由特定的文件系统实现,文件系统没有实现的标记为NULL。2.7 Inode结构(特定文件系统必须实现该结构的子集)Inode结构也是相当庞大,但是为了简单,同样只涉及三个成员:其中i_size为文件的大小,正如2.1所说,该结构需要保存到存储介质上。成员i_op为文件的基本操作的函数集合,包括mkdir(文件夹也是一个文件),link和rename等函数,这些函数中的部分都由特定的文件系统实现,文件系统没有实现的标记为NULL。成员i_fop是文件操作函数的集合,必须由特定文件系统实现。2.8 File结构(特定文件系统必须实现该结构中f_op的子集)File结构的成员也很多,但是跟Inode和Super_block的最大区别在于File文件的成员不会保存在存储介质上,File结构定义如下:其中f_op为文件操作的函数集,这些函数主要由特定文件系统定义,其中f_op等于inode的i_fop。2.9 File_system_type、dentry、Vfsmount、Super_block、Inode和File结构之间的关系说了这么多结构,肯定有点晕了,我也是比较讨厌看书的时候写一大堆数据结构,所以上面的六个个结构我尽量精简,主要能说明主要脉络就可以。下面以图表明它们之间的关系:File_system_type通过get_sb函数(从存储介质读取数据)初始化Vfsmount的成员变量mnt_sb的部分成员,s_op由

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论