Linux虚拟文件系统二

来源:互联网 发布:vb中过程的主要作用 编辑:程序博客网 时间:2024/05/18 01:48

        这一周的前二天主要分析了师姐编的三个小程序,还有就是学习了Linux2.4.30内核文件系统学习这篇文章。

      VFS从根本上来说就是提供一套代码框架,根据共有的属性抽象出最关键的数据结构,面向具体的文件系统定义一系列统一的操作接口,对文件和目录抽象出的inode结构提供统一的操作接口,能对具体的文件系统进行注册和安装等。

       打开文件的过程就是寻找目录节点对应的inode的过程,当根据路径找到相应的目录节点时inode中的i_fop成员就已经与文件所在的文件系统的统一接口,也就是file_operations相关联了。

        从文件系统抽象出的四个数据结构中,最核心的要数目录节点入口dentry结构体了,通过路径很容易能找到要打开文件的dentry,相应的只需要将dentryinode关联起来就可以了,同时我们应该对这两个结构的对应关系要清楚,一个文件对应唯一的inode,由于链接文件的存在,一个文件可能对应多个dentry,一个dentry只能对应一个inode,而一个inode可能对应多个dentry,dentry中用alias成员将一个文件的所有别名链接起来。

       超级块结构体除了描述文件系统的大小,以及读写状态等,最关键的还要数它提供的操作接口,这里面主要包括inodedentry的相关操作,例如分配、撤销、读、写、删除inode等等。

       内核中已经安装了的文件系统都会有一个vfsmount结构体与之相对应,安装一个文件系统的步骤大致如下:创建一个vfsmount结构体,为被安装的设备创建一个超级块结构体,并进行相关设置,创建被安装设备的根目录节点dentry,为被安装设备的根目录节点为创建inode,并由超级块操作接口函数来进行inode的相关设置,将超级块与被安装设备的根目录节点dentry关联起来,最后将vfsmount与被安装设备的根目录节点dentry关联起来。安装了文件系统后还需要注册才能使内核认识这个文件系统。已注册的文件系统的信息都在file_system_type结构体中记录着,并通过list_head链表链接起来,每当有一个新的待注册的文件系统要注册时就会创建一个file_system_type,并与之前创建的超级块关联起来,以及完成其它诸如名称,标志等相关设置并链接到list_head上。

       与file相关的结构体有好几个,file被称为系统打开表,记录了系统中所有打开的文件,当打开一个文件时就会在内核中创建一个file与之关联起来,files_struct被称为用户打开文件表,记录了每个进程打开的所有文件,当用open调用时返回的文件描述符就在这个结构中进行记录,文件描述符fd实际上是一个整数下标,内核实现的方法是采用数组*fd_array[]来存储每个进程打开的文件,系统最初分配的数组大小是32,当超过32时系统便会分配更大的数组来存储文件描述符,还有另一个重要的结构体是fs_struct,它是记录进程与文件系统相关联的结构体。

 

原创粉丝点击