陈莉君 2010年01月23日 星期六 15:26 | 2162次浏览 | 2条评论
导言:
在Linux文件系统设计中,有两个统一:
1)不管文件还是设备,都统一看做文件。
2)在第一个统一的基础上,不管文件还是设备,都调用统一的系统调用,如open(),close()等
以上的统一,隐藏了不同文件系统,不同文件以及不同设备的差异,这是建立在对这些对象高度抽象的基础上的。另一方面,逐层剥离,由表及里,可以触及到各个具体文件系统的真相,从而真正理解为什么file_operation是所有设备文件的接口。
—————————————————————————————————
虚拟文件系统所提供的抽象界面主要由一组标准的、抽象的操作构成,例如read()、write()、lseek等,这些函数以系统调用的形式供用户程序调用。这样,用户程序调用这些系统调用时,根本无需关心所操作的文件属于哪个文件系统,这个文件系统是怎样设计和实现的。
Linux 内核中,VFS与具体文件系统的关系如图1 所示
图1 VFS与具体文件系统之间的关系
Linux 的目录建立了一棵根目录为“ / ”的树。根目录包含在 根文件系统 中,在 Linux 中,这个根文件系统通常就是 Ext2 或Ext3 类型。其他所有的文件系统都可以被“安装”在根文件系统的子目录中。 例如,用户可以通过“mount”命令,将DOS格式的磁盘分区(即FAT文件系统)安装到Linux系统中,然后,用户就可以像访问Ext2或Ext3文件一样访问DOS的文件。
例如:假设用户输入以下shell命令:
$ cp /mnt/dos/TEST /tmp/test
其中 /mnt/dos 是 DOS 磁盘的一个安装点,而 /tmp 是一个标准的第三扩展文件系统( Ext3)的目录。 如图1所示, VFS 是用户的应用程序与具体文件系统之间的抽象层。因此, cp 程序并不需要知道 /floppy/TEST 和 /tmp/test是什么文件系统类型。相反, cp 程序通过系统调用直接与VFS交互。cp 所执行的代码片段如下:
inf=open( “ /mnt/dos/TEST ” ,O_RDONLY,O);
outf=open( “ /tmp/test ” ,O_WRONLY|O_CREATE|O_TRUNC,0600);
do{
l=read(inf,buf,4096);
write(outf,buf,l);
}while(l);
为了进一步理解图1,结合上面的程序片段,我们来说明内核如何把对read( )转换为专对DOS文件系统自己的read()调用。
应用程序对read( )的调用引起内核调用sys_read( ),这完全与其他系统调用类似。
asmlinkage ssize_t sys_read(unsigned int fd, char * buf, size_t count)
{
ssize_t ret;
struct file * file;
…
if (file->f_op && (read = file->f_op->read) != NULL)
ret = read(file, buf, count, &file->f_pos);
...
}
文件在内核中是由一个file数据结构来表示的:
struct file{
…
struct file_operation *f_op;
…
}
该数据结构中包含一个称为f_op的域,该域的类型为file_operation结构。该结构包含指向各种函数的指针,例如:
struct file_operation {
…
ssize_t(*read)();
ssize_t(*write)();
int (*open)();
int (*close)();
…
};
每种文件系统都有自己的file_operation结构,结构中的域几乎全是函数指针。因此,当应用程序调用read( )系统调用时,就会陷入内核而调用sys_read( ),而sys_read( )通过file结构中的指针f_op就会调用DOS文件系统的read():
file->f_op->read(...);
与之类似,write( ) 操作也会引发一个与输出文件相关的 Ext3 (而不是DOS文件系统)写函数的执行。
由此可以看出,如果把内核比拟为 PC 机中的“母板”,把 VFS 比拟为“母板”上的一个“插槽”,那么,每个具体的文件系统就好像一块块“接口卡”。不同的接口卡上有不同的电子线路,但是,它们与插槽的连接有几条线,每条线做什么有明确的定义。同样,不同的文件系统通过不同的程序来实现其各种功能,但是,与 VFS 之间的界面则是有明确定义的。这个界面就是 file_operation() 结构。
Zeuux © 2024
京ICP备05028076号
回复 向东 2010年01月26日 星期二 19:44
-
看来设计