VFS虚拟文件系统

woaibie_

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的指针,
展开更多 50%)
分享

猜你喜欢

VFS虚拟文件系统

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
VFS虚拟文件系统

虚拟文件系统

编程语言 网络编程
虚拟文件系统

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

ReiserFS文件系统

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
ReiserFS文件系统

Vista虚拟文件夹探索之旅

windows 操作系统
Vista虚拟文件夹探索之旅

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

文件系统控件方案

编程语言 网络编程
文件系统控件方案

MySQL的文件系统

编程语言 网络编程
MySQL的文件系统

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Windows操作系统中如何完全删除输入法

Windows操作系统中如何完全删除输入法

OFFICE有鬼 2005年1月8日

OFFICE有鬼 2005年1月8日
下拉加载更多内容 ↓