文件系统(三)-由表及里
来源:互联网 发布:怎样做淘宝店铺装修 编辑:程序博客网 时间: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()结构。
- 文件系统(三)-由表及里
- 文件系统(三)-由表及里
- 文件系统(三)
- html5 文件系统(三)
- exfat文件系统(三)
- PowerShell文件系统(三)导航文件系统
- 存储基础知识(三):文件系统
- linux 0.11 文件系统(三)
- U盘文件系统(三)
- 由表及里之系统调用(getpid)[转]+ kjpioo的注释
- 由表及里看模式
- 由表及里看模式
- 由表及里看模式
- Linux文件系统(三)—— 文件系统常用工具介绍
- [文件系统]文件系统学习笔记(三)---目录项缓存dentry
- Exynos4412 文件系统制作(三)—— 文件系统移植
- Exynos4412 文件系统制作(三)—— 文件系统移植
- OGRE分析之文件系统(三)
- 用模板函数定义回调方法
- Linux文件系统(一)-群居和一
- Linux文件系统(二)-为仁由己
- 想写个日志类
- 什么是OTA?
- 文件系统(三)-由表及里
- GB/T的发音(哥波特)
- Curriculum Vitae
- 正则表达式学习参考
- 搭建OTA下载服务器
- 第十二课 日期处理
- XML的接口标准DOM与SAX的区别
- 变参数printf解析
- OpenGL学习3