文件系统(三)-由表及里

来源:互联网 发布:怎样做淘宝店铺装修 编辑:程序博客网 时间:2024/06/06 02:46

 

导言:

  在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()结构。

 

原创粉丝点击