VFS及LINUX中文件系统的组织
关于VFS,我以前从未听说过,所以拿到题目之后免不了要花些时间查了很多的资料。
什么是VFS?
VFS(VirtualFileSystem)称“虚拟文件系统”,是LINUX文件系统的一个重要的组成部分。它不是一个真正的文件系统,实际上它是一种软件机制,也许称它为Linux的文件系统管理者更确切点。
VFS的主要内容
超级块(super_block)
对具体文件系统的超级块是文件系统中最重要的数据结构,它用来描述整个文件系统信息(组织结构和管理信息)。不涉及文件系统的内容。VFS超级块是各种具体文件系统在安装时建立的,并在这些文件系统卸载时自动删除。VFS超级块实际上应该说成是某个具体文件系统的VFS超级块。超级块对象由super_block结构组成。
索引节点对象(inode,即I节点)
文件系统处理文件所需的信息。索引节点对文件是唯一的。具体文件系统的索引节点存储在磁盘上,使用的时候,必须调入内存,填写VFS的索引节点。所以VFS的索引节点是动态节点。
目录项(dentry)
每个文件除了有一个索引节点结构外,还有目录项dentry结构。dentry结构代表的是逻辑意义上的文件,在磁盘上没有对应的映象。而inode结构代表的是物理意义上的文件,对于一个具体的文件系统,在磁盘上有对应的映象。
一个dentry结构必有一个inode结构,而一个inode可能对应多个dentry结构。
由于从磁盘读入一个文件并构造相应的目录项需要花费大量的时间,而在完成对目录项的操作后,可能后面还会用到,所以在内存中要保留它。
VFS有什么好处?
既然写这个,自然要关注一下VFS的特别之处,那么VFS到底都有些什么特别的功能呢?
支持N多种杂七杂八的文件系统
用惯了WINDOWS的人都知道在格式化文件系统的时候只有少数几种种选择:FAT和NTFS等等。但是LINUX却可以支持诸如EXT2,Minix,FAT,VFAT,NFS,NTFS…等等10多个不同的文件系统。正是VFS,为LINUX实现了这一强大功能。
概括来说,实现这种支持是通过文件系统的“注册”来完成的。经由注册的文件系统,VFS会给系统内核提供一个调用该文件系统函数的接口。
值得注意的是,Linux并非通过设备标识访问某个文件系统(像DOS那样),而是捆绑于一个树状目录上,因此,mount一个文件系统不仅包含了文件及数据,还包含了文件系统本身的树形结构,目录,访问权限等等。这里边的实现其实是很复杂的,鉴于作者的水准,本文将这些过于复杂的东西略去,只讨论一些易于理解的东西。(读者如果有意了解,请搜关键字“VFS目录树”)
下面简单说说这种功能的实现。
在Linux源代码中,每种实际的文件系统用以下的数据结构表示:
structfile_system_type{
constchar*name;//文件系统名称
intfs_flags;//标示位
structsuper_block*(*read_super)(structsuper_block*,void*,int);//read_super是文件所涉及的文件操作针对内存中的数据对象的指针
//超级块指针
structmodule*owner;//实例所有者指针
structfile_system_type*next;//链表同级指针
structlist_headfs_supers;
};
每注册一个文件系统也就要在机器里初始化一个这样的数据结构,并形成一个链表,内核中用一个名为file_systems的全局变量来指向该链表的表头。
整个注册过程比较复杂,概括来说大概是如下几步:
1,新建VFS目录树init_mount_tree()
(这里边包含有若干步骤,此处不赘)
2,通过sys_mkdir函数将文件系统作为结点添加到VFS目录树中
当用户调用一个文件时,他不需要因为文件属于不同的文件系统而按照不同的方式读取。VFS本身抽象了不同文件系统共同部分,对用户屏蔽了具体的操作,使得用户不用再去关心文件所属的文件系统的问题,实现了各个文件系统的良好兼容。当一个最新推出的文件系统普遍被采用时,LINUX借助VFS的强大功能,可以毫不费力的实现新文件系统在本地的组织运行,同时能不干扰其他已经装配在本地的其他文件系统,可以说以VFS组织文件系统是非常具有可扩展性,并具有优良的发展前景。
阅读(814) | 评论(0) | 转发(0) |