参照《操作系统:设计与实现》,本文中的很多文字和图片来源于此书。
MINIX文件系统是一个逻辑的、自包含的实体。在磁盘上它由六部分组成,分别是:引导块,超块、i-节点、
i-节点位图、区段位图、数据块。具体结构如下图所示:
每个文件系统都以引导块开始,引导块的最后两个字节是魔数0x55AA.引导块大小为数据块的一块,一般为512字节。启动计算机时,硬件从引导设备将磁盘的引导块读入内存,转而执行其代码,接下来引导块负责将操作系统从磁盘读入内存,并启动操作系统。
超级块包含了文件系统的布局信息,它的主要功能是给出文件系统不同部分的大小,具体如下所示:
i-节点位图用于标识i-节点的使用情况,区段位图用于标识区段的使用状况。i-节点用于记录文件(包括目录文件和普通文件),当创建一个新的文件时就为它分配一个i-节点。为文件分配数据是以区段为单位进行的,而读文件时却是以块为单位进行的。使用区段的目的是:确保同一文件的所有磁盘块都位于同一个柱面上,从而改进读取文件的性能。区段一般由1-N个数据块构成,它是一种逻辑存在,在物理磁盘上只有数据块,但在为文件分配数据时是以区段为单位进行分配的。在文件系统创建时,根目录就自动存在。i-节点位图和区段位图有两位分别为1,表明已经分配出去了,一位是第0位,此位不可用所以为1,一位是根目录所在的位。
文件i-节点的主要功能是给出文件数据块所在的位置,当要打开文件时,首先要找到文件的i-节点,并把它载入内存的inode表中,直到关闭前,它一直保留在内存中。当多个进程打开同一个文件时,内存的inode中有一个计数器来计数,只有当计数器减为0的时候才会释放此i-节点。i-节点如下图所示:
上述i-节点有七个区段和两个间接区段,譬如区段的大小为1k,一个只有7k大小的文件需要用zone0-zone6来标识,它们分别存储了所使用的区段号。注意第二项中的Number of links是指文件系统中目录文件引用此i-节点的次数。当用户读取一个文件时,读到它的i-节点后就需要根据其区段号来读取其数据数据块,读取数据块并不是直接从磁盘上读取的,在内存中Minix有一个块高速缓存,操作系统先去该高速缓存中查找块,看是否在其中,如果未查找到,才发送读消息给磁盘任务去读取一个块到高速缓存中。块高速缓存的结构如下图所示:
图中的LRU指向不在使用的块。hash表以块号的低N为作为哈希索引。
Minix中查找一个文件的过程为:由于根目录是在文件系统创建时就已经存在了的,所以系统会首先找到根目录,然后根据目录项中的i-节点号,找到对应目录的i-节点,逐步查找到需要文件或目录的i-节点为止,找到i-节点就可以加载文件了。示例如下图所示:
当用户需要挂载一个新的目录时,操作系统会在超级块的表项中填写两项来表明其挂载,一项是指向被安装文件系统的根目录i-节点;一项是指向该文件系统所安装到的i-节点,比如下图中的/usr.
文件系统中还有一个概念是文件描述符,它位于进程表中,文件描述符并不是直接指向其所指文件的i-节点,而是在中间隔了一个filp表,此表的主要作用是便于进程共享同一个i-节点,即共享同一个文件,因为当有多个进程读写同一个文件时,协商好读写文件位置是一个问题。它们的关系如下:
阅读(2028) | 评论(0) | 转发(0) |