MINIX文件系统与标准UNIX的文件系统基本相同,它由6个部分组成:引导块;超级块;i节点位图;逻辑块位图;i节点;数据块。对于一个普通的磁盘块设备来说,其各部分的分布见下图: 整个块设备被划分成以1KB为单位的磁盘块。 引导块是计算机加电启动时可由ROMBIOS自动读入的执行代码和数据盘块。但一个系统中并非所有盘设备都用于作为引导设备,所以对于不用于引导的盘片,这一盘块中可以不含代码。但任何盘块设备必须含有引导块空间,以保持MINIX文件系统格式的统一。即文件系统只是在块设备上空出一个存放引导块的空间。如果你把内核映像文件放在文件系统中,那么你就可以在文件系统所在设备的第1个块(即引导块空间)存放实际的引导程序,并由它来取得和加载文件系统中的内核映像文件。 对于容量巨大的硬盘块设备,通常会在其上会划分出几个分区,并且在每个分区中都可存放一个不同的完整文件系统,见下图。 图中表示有4个分区,分别存放着FAT32文件系统、NTFS文件系统、MINIX文件系统和EXT2文件系统。硬盘的第一个扇区是主引导扇区,其中存放着硬盘引导程序和分区表信息。分区表中的信息指明了硬盘上每个分区的类型、在硬盘中起始位置参数和结束位置参数以及占用的扇区总数,参见kernelblkdrvhd。c文件后的硬盘分区表结构 超级块用于存放盘设备上文件系统的结构信息,并说明各部分的大小。其结构见下图(MINIX文件系统): 系统启动时会从磁盘的超级块中读取信息,初始化上图表中的数据结构。 其中,sninodes表示设备上的i节点总数。snzones表示设备上以逻辑块为单位的总逻辑块数。simapblocks和szmapblocks分别表示i节点位图和逻辑块位图所占用的磁盘块数。sfirstdatazone表示设备上数据区开始处占用的第一个逻辑块块号。slogzonesize是使用2为底的对数表示的每个逻辑块包含的磁盘块数。对于MINIX1。0文件系统该值为0,因此其逻辑块的大小就等于磁盘块大小,都是1KB。smaxsize是以字节表示的最大文件长度,这里不超过4GB。当然这个长度值将受到磁盘容量的限制。smagic是文件系统魔幻数,用以指明文件系统的类型。structminixsbinfo{unsignedlongsninodes;该成员用于描述MINIXFS文件系统含有的inode数量。该值用于计算InodeBitmap和InodeTable的大小unsignedlongsnzones;该成员用于描述MINIXFS文件系统中含有的Zone的数量。该值用于计算ZoneBitmap。unsignedlongsimapblocks;该成员用于描述InodeBitMap占用BLOCKSIZE的数量,InodeBitMap中的每个位表示一个inode的使用情况,如果某一个置位,那么对应的minixinode就被使用,反之表示对应的minixinode没有被使用。unsignedlongszmapblocks;该成员用于描述ZoneBitMap占用BLOCKSIZE的数量。ZoneBitMap中的每个位表示一个Zone的使用情况,如果某一位置位,那么对应的zone就被使用,反之表示对应的zone没有被使用。该成员用于描述第一个datazone所在的block号。Zone分为两类,一类是Reserved的,用于存储MINIXFS的系统信息,另外一类是Datazone,用于存储文件和目录的,而sfirstdatazone用于指向第一个datazone的block号unsignedlongsfirstdatazone;MINIXFS将文件系统分成BLOCKSIZE大小的数据块,BLOCKSIZE的大小由slogzonesize决定,其计算方法如下:BLOCKSIZE1024slogzonesizeunsignedlongslogzonesize;unsignedlongsmaxsize;simap〔8〕是一个文件缓存数组。数组用于缓存MINIXFS的所有InodeBitMap内容。structbufferheadsimap〔8〕;szmap〔8〕是一个文件缓存数组,数组用于缓存MINIXFS的所有ZoneBitMap内容structbufferheadszmap〔8〕;sdirsize用于描述minixdirentry结构的大小,minixdirentry用于描述一个minix目录。unsignedlongsdirsize;unsignedlongsnamelen;snamelen用于描述文件或目录名字的大小structbufferheadssbh;ssbh用于缓存磁盘中MINIXFS的超级快信息structminixsuperblocksms;sms用于指向minixsuperblock在内存中的位置。unsignedshortsmountstate;smountstate用于描述MINIXFS的mount状态。}; 较低版本系统中使用一个全局的superblocks〔〕来保存超级块,该数据有多少元素也就支持多少个文件系统,高版本使用全局的superblocks链表。 超级块表将在super。c程序的mountroot()函数中被初始化,在readsuper()函数中会为新加载的文件系统在表中设置一个超级块项,并在putsuper()函数中释放超级块表中指定的超级块项。 逻辑块位图用于描述盘上每个数据盘块的使用情况。除第1个比特位(位0)以外,逻辑块位图中每个比特位依次代表盘上数据区中的一个逻辑块。因此逻辑块位图的比特位1代表盘上数据区中第一个数据盘块,而非盘上的第一个磁盘块(引导块)。当一个数据盘块被占用时,则逻辑块位图中相应比特位被置位。由于当所有磁盘数据盘块都被占用时查找空闲盘块的函数会返回0值,因此逻辑块位图最低比特位(位0)闲置不用,并且在创建文件系统时会预先将其设置为1。 当向磁盘申请一个逻辑块时,对整个逻辑块位图进行搜索,寻找首个是0 的比特位,该比特位所在的序号即为该数据库的逻辑块号,然后把逻辑块号保存到idata〔〕中。 从超级块的结构中我们还可以看出,逻辑块位图最多使用8块缓冲块(szmap〔8〕),而每块缓冲块大小是1024字节,每比特表示一个盘块的占用状态,因此一个缓冲块可代表8192个盘块。8个缓冲块总共可表示65536个盘块,因此MINIX文件系统1。0所能支持的最大块设备容量(长度)是64MB。 i节点用于存放盘设备上每个文件和目录名的索引信息。i节点位图用于说明i节点是否被使用,同样是每个比特位代表一个i节点。对于1K大小的盘块来讲,一个盘块就可表示8192个i节点的使用状况。与逻辑块位图的情况类似,由于当所有i节点都被使用时查找空闲i节点的函数会返回0值,因此i节点位图第1个字节的最低比特位(位0)和对应的i节点0都闲置不用,并且在创建文件系统时会预先将i节点0对应比特位图中的比特位置为1。因此第一个i节点位图块中只能表示8191个i节点的状况。 盘上的i节点部分存放着文件系统中文件或目录名的索引节点,每个文件或目录名都有一个i节点。每个i节点结构中存放着对应文件或目录的相关信息。 所以图中 imode。。。izone〔〕这些一条条信息是保存到磁盘中的inode信息,当需要某个读取inode信息时,会从i节点中读取一条对应的inode信息保存到内存中,同时是使用izone〔〕进行初始化inode结构中的idata〔〕,所以在内存中使用的是idata〔〕保存数据块地址,当同步inode节点时,把内存中的idata〔〕刷到磁盘izone〔〕中。 当创建一个inode节点时先从i节点位图中获取一个bit未使用的位,根据该bit位对应的位置下标(比如该bit位置为第1025的位置),根据下标从i节点中计算属于哪个数据块中,然后从对应的块中进行索引找到块中第n条i节点数据, 然后从该i节点数据中izone〔〕中即可获取或者存放数据。 如文件宿主的id(uid)、文件所属组id(gid)、文件长度、访问修改时间以及文件数据块在盘上的位置等。整个i节点结构共使用32个字节,见下图所示: imode字段用来保存文件的类型和访问权限属性。其比特位1512用于保存文件类型,位119保存执行文件时设置的信息,位80表示文件的访问权限,见下图 文件中的数据存放在磁盘块的数据区中,而一个文件名则通过对应的i节点与这些数据磁盘块相联系,这些盘块的号码就存放在i节点的逻辑块数组izone〔〕中。其中,izone〔〕数组用于存放i节点对应文件的盘块号。izone〔0〕到izone〔6〕用于存放文件开始的7个磁盘块号,称为直接块。若文件长度小于等于7K字节,则根据其i节点可以很快就找到它所使用的盘块。若文件大一些时,就需要用到一次间接块了(izone〔7〕),这个盘块中存放着附加的盘块号。对于MINIX文件系统一个盘块中可以存放(10242)512个盘块号,因此可以寻址512个盘块。若文件还要大,则需要使用二次间接盘块(izone〔8〕)。二次间接块的一级盘块的作用类似与一次间接盘块,因此使用二次间接盘块可以寻址512512个盘块。参见下图所示: 所以对于MINIX文件系统1。0版来说,一个文件的最大长度为(7512512512)262,663KB。 这些izone〔〕信息是保存在磁盘中的,当读取inode时会把这些izone〔〕刷到inode中的idata〔〕中,也即是在内存中以idata〔〕方式存在。 另外,对于dev目录下的设备文件来说,它们并不占用磁盘数据区中的数据盘块,即它们文件的长度是0。设备文件名的i节点仅用于保存其所定义设备的属性和设备号。设备号被存放在设备文件i节点的zone〔0〕中。 当所有i节点都被使用时,查找空闲i节点的函数会返回值0,因此,i节点位图最低比特位和i节点0都闲置不用。i节点0的结构被初始化成全零,并在创建文件系统时将i节点0的比特位置位。 参考文档 http:www。oldlinux。orgdownloadCLK5。0WithCover。pdfpage648zoom100,72,450