陈莉君

陈莉君的博客

她的个人主页  她的博客

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

陈莉君  2010年01月23日 星期六 15:26 | 1926次浏览 | 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哲思注册吗?现在 注册 !
向东

回复 向东  2010年01月26日 星期二 19:44

如果把内核比拟为 PC 机中的“母板”,把 VFS 比拟为“母板”上的一个“插槽”,那么,每个具体的文件系统就好像一块块“接口卡”。。。。
----------------------------------------------
看来设计模式中的依赖倒转原则在Linux内核中这里也有一定的体现啊,拜读了留个脚印,强烈支持,谢谢陈老师的分享:)

0条回复

成力

回复 成力  2010年01月25日 星期一 01:35

支持一下。

0条回复

暂时没有评论

Zeuux © 2022

京ICP备05028076号