当前位置:嗨网首页>书籍在线阅读

41-虚拟文件系统

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

2.11.1 虚拟文件系统

虚拟文件系统,有时也称虚拟文件交换(virtual file switch),是一种抽象机制,支持Linux内核在不了解(甚至不需要了解)文件系统类型的情况下,调用文件系统函数并操作文件系统的数据。

虚拟文件系统通过通用文件模型(common file model)实现这种抽象,它是Linux上所有文件系统的基础。通过函数指针以及各种面向对象方法,通用文件模型提供了一种Linux内核文件系统必须遵循的框架。它支持虚拟文件系统向文件系统发起请求。框架提供了钩子(hook),支持读、建立链接、同步等功能。然后,每个文件系统注册函数,处理相应的操作。

这种方式的前提是文件系统之间必须具有一定的共性。比如,虚拟文件系统是基于索引节点、superblock(超级块)和目录项,而非UNIX系的文件系统可能根本就没有索引节点的概念,需要特殊处理。而事实上,Linux确实做到了:它可以很好地支持如FAT和NTFS这样的文件系统。

虚拟文件系统的优点真是“不胜数”:系统调用可以在任意媒介的任意文件系统上读,工具可以从任何一个文件系统拷贝到另一个上。所有的文件系统都支持相同的概念、相同接口和相同调用。一切都可以正常工作——而且工作得很好。

当应用发起read()系统调用时,其执行过程是非常奇妙的:从C库获取系统调用的定义,在编译时转化为相应的trap语句[8]。一旦进程从用户空间进入内核,交给系统调用handler处理,然后交给read()系统调用。内核确定给定的文件描述符所对应的对象类型,并调用相应的read()函数。对于文件系统而言,read()函数是文件系统代码的一部分。然后,该函数继续后续操作——比如从文件系统中读取数据,并把数据返回给用户空间的read()调用,该调用返回系统调用handler,它把数据拷贝到用户空间,最后read()系统调用返回,程序继续执行。

对于系统程序员来说,虚拟文件系统带来的“变革”是很深刻的。程序员不需要担心文件所在的文件系统及其存储介质。通用的系统调用——比如read()、write()等,可以在任意支持的文件系统和存储介质上操作文件。