分享
 
 
 

虚拟文件系统

王朝other·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

Richard Gooch

翻译: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,这是内核中

的文件描述)结构。新分配的struct file结构被指向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的指针,此结构描述了文件系统实现的下一层细节。

struct super_operations

=======================

此结构描述了VFS对文件系统的超级块所能进行的操作。

在内核2.1.99中,此结构的定义如下:

(注:在2.2的内核中,此结构已经有了改变)

struct super_operations {

void (*read_inode) (struct inode *);

void (*write_inode) (struct inode *);

void (*put_inode) (struct inode *);

void (*delete_inode) (struct inode *);

int (*notify_change) (struct dentry *, struct iattr *);

void (*put_super) (struct super_block *);

void (*write_super) (struct super_block *);

int (*statfs) (struct super_block *, struct statfs *, int);

int (*remount_fs) (struct super_block *, int *, char *);

void (*clear_inode) (struct inode *);

};

除非非凡提出,所有的方法都在未加锁的情况下被调用,这意味着大多数方法都可以

安全的被阻塞。所有的方法都仅仅在进程空间被调用(例如,在中断处理程序和底半

部中不能调用它们)

read_inode:从一个文件系统中读取一个特定的i节点时调用此方法。i节点中的域"i_ino"

又VFS初始化为指向所读的i节点,其余的域被此方法所填充。

write_inode:当VFS需要向磁盘上的一个i节点写时调用。

put_inode:当VFS的i节点被从i节点缓冲池移走时被调用。此方法是可选的。

delete_inode:当VFS想删除一个i节点时调用次方法。

notify_change:当VFS的i节点的属性被改变时调用。若此域为NULL则VFS会调用write_inode

.

此方法调用时需要锁住内核。

put_super:当VFS要释放超级块时调用(umount一个文件系统).此方法调用时需要锁住内核。

write_super:当VFS超级块需要被写入磁盘时被调用。此方法为可选的。

statfs:当VFS需要得到文件系统的统计数据时调用。此方法调用时需要锁住内核。

remount_fs:当文件系统被重新安装时调用。此方法调用时需要锁住内核。

clear_inode:当VFS清除i节点时调用。可选项。

以上方法中,read_inode需要填充"i_op"域,此域为一个指向struct inode_operations

结构的指针,它描述了能够对一个单独的i节点所能进行的操作。

struct inode_operations

=======================

此结构描述了VFS能够对文件系统的一个i节点所能进行的操作。

在内核2.1.99中,此结构的定义如下:

(注:在2.2的内核中,此结构已经有了少许改变)

struct inode_operations {

struct file_operations * default_file_ops;

int (*create) (struct inode *,struct dentry *,int);

int (*lookup) (struct inode *,struct dentry *);

int (*link) (struct dentry *,struct inode *,struct dentry *);

int (*unlink) (struct inode *,struct dentry *);

int (*symlink) (struct inode *,struct dentry *,const char *);

int (*mkdir) (struct inode *,struct dentry *,int);

int (*rmdir) (struct inode *,struct dentry *);

int (*mknod) (struct

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有