woaibie_
2016-01-29 18:36
VFS虚拟文件系统,VFS虚拟文件系统
虚拟文件系统蓝森林 http://www.lslnet.com 2001年5月20日 21:16作 者: difeijingRichard Gooch 23-APR-1999翻译:difeijing 本文档中的惯例用法 ==================文档中的每一节标题的右边都有一个字符串""。每个小节都会有个""在右边。这些字符串是为了在文档中查询更容易而设的。注意:本文档的最新更新可在下面找到:http://www.atnf.csiro.au/~rgooch/linux/docs/vfs.txt
它到底是什么? =============Virtual File System(或者被称为Virtual Filesystem Switch)是Linux内核中的一个软件层,用于给用户空间的程序提供文件系统接口。它也提供了内核中的一个抽象功能,允许不同的文件系统共存。它的工作方式的概览 ==================在这一节里,在讲解细节问题之前,我会简单扼要的介绍一下VFS是如何工作的。首先,介绍一下当用户程序打开或者操作文件时发生了些什么,然后看看一个文件系统是如何被支持的。打开一个文件 ------------VFS实现了open(2)系统调用。路径参数被VFS用来在目录入口缓存(dentry cache or "dcache")。这提供了一个将路径名转化为特定的dentry的一个快的查找机制。一个单独的dentry通常包含一个指向i节点(inode)的指针。i节点存在于磁盘驱动器上,它可以是一个规则文件,目录,FIFO文件,等等。Dentry存在于RAM中,并且永远不会被存到磁盘上:它们仅仅为了提高系统性能而存在。i节点存在于磁盘上,当需要时被拷入内存中,之后对它的任何改变将被写回磁盘。存在于RAM中的i节点就是VFS的i节点,dentry所包含的指针指向的就是它。dcache是你的整个文件空间的观察点。跟Linus不同,我们中的大多数人不可能有足够的RAM空间来放我们的文件空间的所有文件的目录入口缓存(dentry),所以我们的dcache会有缺少的项。为了将路径名转换为一个dentry,VFS不得不采取创建dentry的方式,并在创建dentry时将指针指向相应的i节点。这是通过对i节点的查找完成的。为了查找一个文件的i节点(通常从磁盘上读),VFS需要调用该文件的父目录的lookup()方法,此方法是特定的文件系统所设置的。后面对此将会有更详尽的描述。一旦VFS得到了所需要的dentry(同时也得到了相应的i节点),我们就能够对文件做想要的操作:打开文件,或者用stat(2)来看i节点中的数据。stat(2)的操作非常简单:在VFS得到dentry之后,它取得inode中的一些数据并将其中的一部分送回用户空间。打开一个文件需要其它的操作:分配一个struct file(定义于linux/fs.h,这是内核中的文件描述)结构。新分配的structfile结构被指向dentry的指针和对文件进行操作的函数集合所初始化,这些都是从i节点中得到的。通过这种方式,特定的文件系统实现才能起作用。文件结构(struct file)被放在进程的文件描述符表中。读,写和关闭文件(或者其它的VFS操作)是通过使用用户空间的文件描述符找到相应的文件结构(struct file),然后调用所需要的方法函数来实现的。当文件处于打开状态时,系统保持相应的dentry为"open"状态(正在使用),这表示相应的i节点在被使用。注册和安装一个文件系统 ----------------------如果你想在内核中支持一种新的文件系统的话,你所需要做的仅仅是调用函数register_filesystem().你向内核中传递一个描述文件系统实现的结构(struct filesystem), 此结构将被加入到内核的支持文件系统表中去。你可以运行下面的命令:% cat /proc/filesystems这样可以看到你的系统支持哪些文件系统。当一个mount请求出现时,VFS将会为特定的文件系统调用相应的方法。安装点的dentry结构将会被改为指向新文件系统的根i节点。现在是看看细节的时候了,nice to look!struct file_system_type =======================此结构描述了文件系统。在内核2.1.99中,此结构的定义如下:(注:在2.2的内核中,此结构也没有变化)struct file_system_type {const char *name;int fs_flags;struct super_block *(*read_super) (struct super_block *, void *, int);struct file_system_type * next;};其中各个域的意义:name:文件系统的类型名称,如"vfat","ext2",等等。fs_flags:变量标志,如FS_REQUIRES_DEV, FS_NO_DCACHE,等等.read_super:当此种文件系统的一个新的实例要被安装时,此方法会被调用。next:被内部的VFS实现所使用,你只需要将其初试化为NULL。函数read_super具有以下的参数:struct super_block *sb:超级块结构。此结构的一部分被VFS初始化,余下的部分必须被函数read_super初始化。void * data:任意的安装选项,通常是ASCII的字符串。int silent:表示当出现错误时是否保持安静。(不报警?)read_super方法必须确定指定的块设备是否包含了一个所支持的文件系统。当成功时返回超级块结构的指针,错误时返回NULL。read_super方法填充进超级块结构(struct super_block)的最有用的域是"s_op"域。这是一个指向struct super_operations的指针,