VFS以链表的形式管理已经注册的文件系统。文件系统的注册有两种途径,一种是编译操作系统内核的时候确定了可以支持那性文件系统,在文件系统被引导是,在VFS中进行注册。第二种是文件系统被当作可装载模块,通过insmod/rmmod命令在装入该文件系统模块时向VFS注册。
VFS的初始化函数用来向VFS注册,即填写文件注册表file_system_type数据结构。每一个文件系统类型在注册表中有一个登记项,记录该文件系统的类型名、文件系统特性、指向对应的VFS超级块读取函数的地址及已注册项的链指针等。函数register_filesystem()用于注册文件系统类型,函数unregister_filesystem()用于注销一个文件系统类型。
要使用一个文件系统,仅仅注册是不行的,还必须安装这个文件系统, linux不通过设备标识来访问某个文件系统,而是通过命令把他安装到文件系统树形目录结构的某个目录结点,安装后该文件系统的所有文件和子目录就是该目录结点的文件和子目录,直到用命令显示的卸载该文件系统。
安装一个文件系统时,内核首先要检查参数的合法性,VFS通过查找由file_systems(file_system_type的首结点)指向的注册表,寻找匹配的file_system_type.就可获得读取文件系统超级块函数的地址,接着查找作为新文件系统安装点的VFS inode,VFS安装程序必须分配一个VFS超级块,然后读入安装文件系统的超级块,并进行填充,再申请一个vfsmount数据结构(其中包含了文件系统所在的块设备的标识、安装点及指向VFS超级块的指针等),使它的指针指向所分配的VFS超级块。当文件系统安装以后,他的根inode便常驻在inode高速缓存中。
总的来说,安装过程的主要工作是:创建安装点对象、将其挂接到根文件系统的指定安装点下、初始化超级块对象从而获得文件系统的基本信息和相关的操作。
使用umount卸载某个文件系统时,必须首先检查文件系统是否可卸载。如果文件系统中的目录或文件正在使用,则VFS索引结点缓冲区中可能包含对应的VFS索引结点。内核根据文件系统所在的设备的标识符,检查在索引结点缓冲区中是否有来自该文件系统的VFS索引结点,如果有且使用计数大于0,则该文件系统不能被卸载;否则,查看对应的VFS超级块的标志,如果为“脏”,则必须将超级块信息写回磁盘。上述过程结束后,才可以释放对应的VFS超级块,vfsmount数据将从vfsmntlist链表中断开并被释放。从而卸载了整个文件系统。
具体的代码我在这里就不说了,内核中都有,大家下去可以看看。
阅读(11428) | 评论(2) | 转发(1) |