本文是个人分析《Linux内核设计与实现》而写的总结,欢迎转载,请注明出处:
http://blog.csdn.net/dlutbrucezhang/article/details/13004095
第六章--虚拟文件系统
我们都知道,其实我们的文件系统是在硬盘的分区中的,那么怎么才能利用硬盘中的文件系统呢?而且,文件系统的类型可能是不一样的,像以前我们用的是FAT,现在大多数情况下我们用的都是 NTFS ,那么操作系统是怎么识别和利用的呢?当然,这只是在Windows下的文件系统,在Linux下更常见的是ext3。Linux内核是怎么做到的呢?如果对于每一个文件系统都有一套处理机制,那么内核中处理文件系统的模块是异常的巨大,所以,这不太可能,不过,操作系统确实需要对于不同的文件系统调用不同的机制去处理,这时就是Linux内核中非常强大的一个子系统--虚拟文件系统。
1.通用文件系统接口
这里所说的通用意思是不管是什么操作系统,什么物理介质,我们对于文件系统的操作就只需要调用库函数即可,其他的工作是由内核代替我们来做的。比如,我们想打开一个文件,利用 open 即可,想读写一个文件,只需要调用 read/write 即可。这里的实现其实是面向对象的设计思路--多态。根据文件系统的不同,利用文件系统自身提供的接口,或者是利用虚拟文件系统提供的公共接口来做这些事情。当然,为了做这些事情,我们需要在内核中统一数据结构,让每个文件系统都能提供这个的结构就能利用这个子系统了。
我们需要四个数据结构,分别是:超级块,i节点,目录项,文件,下面我将详细说明这些数据结构。
2.超级块
每一个文件系统需要自己管理自己,对于其中的每一个文件和对文件的操作都需要进行管理,毕竟文件系统就是用来管理文件的。所以,在文件系统中存在一个数据结构称为超级块提供了文件系统中关于文件的所有信息。通常它被称为文件系统控制块,在系统启动后,文件系统会被自动挂载,这时超级块就已经被拷贝到内存中了。
3.i节点
文件系统中最重要的东西当然是文件,对于每一个文件,在Linux中的做法是文件的说明和文件的数据分开存放,这样更利于管理。文件的信息被称为是文件的元数据,其中存储了文件的创建时间,文件的大小等数据。文件的数据则是单独存放的,它的地址记录在i节点中。Linux下的数据是字节流,文件中的数据是一系列的字节,文件的开始是文件头,也是用来描述文件的信息的,比如这是个什么类型的文件当然,它最重要的功能是标识文件内容的开始。文件的尾部是文件尾。文件的所有信息都存在与i节点中,包括文件的所有操作方法,所以,对于文件来说,i节点是最为重要的东西,它是和文件一一对应的,如果i节点被删除了,那么相应的文件也不再存在,反之亦然。
4.目录项
当我们需要打开一个文件时,我们需要文件的路径,可以使相对路径,这里我举一个绝对路径的例子。比如文件的地址是: /root/test/bz 。内核进行解析的时候会创建一系列的目录项,目录项和i节点是相对应的。这时,内核会创建 /,root,test,bz这四个目录项。
5.文件
文件这是一个对进程而言的数据结构,且是进程打开的文件。文件描述符指向这个数据结构,操作文件我们利用的就是这个数据结构,不过,最终是通过i节点的,毕竟,文件操作函数都是记录在i节点之中的。
虚拟文件系统解决了内核支持不同文件系统的方法,不进高效而且美观,方便。理解文件系统用到的数据结构非常重要,当然,这只是基础,对于文件系统具体的工作方式,大家可以去看下《深入理解Linux内核》,这本书中有详细的说明,在这里就不赘述了。