linux 文件系统之 vfs (1)

unix 有一句口号“一切都是文件”,说的是普通文件,外设甚至网络都可以当成一个文件来看待:从磁盘上的文件中读取数据,从鼠标/键盘等外设获得输入,接收网络信息等就是从“文件”中读取数据;把数据保存到文件,将文字显示在屏幕上,播放音乐和电影,发送网络信息等可以认为向“文件”写入数据。这个高度统一的接口为操作提供了巨大的便利,用户不需知道实际的对象是什么,只使用系统提供的 read/write 接口就能完成几乎所有的 IO 操作。

既然所有的设备都能被抽象成文件并且用统一的接口进行操作,而且个人觉得在操作系统的几个组成部分(内存管理,进程调度等)中文件系统是相对简单的部分,从这个统一的接口开始了解其内部工作机制或许是个不错的选择。

虚拟文件系统(Virtual Filesystem Switch)

早在 1985 年 SUN 发表了一篇论文(参考资料 [1]),提出了一个用于 Sun OS 的文件系统接口。论文开头说明了设计的目的:

  • 将与文件系统实现相关的部分和与实现无关的部分分开,两者之间由一个经过良好设计的接口连接;
  • 这些接口需要支持 unix 文件系统的操作原语(如创建/删除文件和目录等操作),并且支持各种各样的文件系统;
  • 接口要满足远程文件系统对于 client 的请求操作(例如一些连接/断开的操作,对应于 open/close);
  • 接口提供的操作都是原子性的,锁操作留给具体实现。

整个接口所在的位置和提供的功能如下:

                            +--------------+
                            | System Calls |
                            +--------------+
                                   |
                            +--------------+
                            | Vnode Layer  

阅读全文…