minix 文件系统的一点问题
我最近在看linux 0.11版本的文件系统,它采用的是minix文件系统。我现在有一个问题百思不得其解,望大家给我指点迷津。我不胜感激!
问题是:super.c中line 161-162为:
s->s_imap[0]->b_data[0] |= 1;
s->s_zmap[0]->b_data[0] |= 1;
linux kernel0.11完全注释上的解释是:对于申请空闲i节点的函数来讲,如果设备上所有的i节点已经全被使用,则查找函数会返回0值。因此0号i节点是不能用的,所以这里将位图中的最低位设置为1,以防止文件系统分配0号i节点。同样的道理,也将逻辑块位图的最低位设置为1。
但我还是不太明白,为什么因此0号i节点就不能用了呀?还有设置b_data[0] |=1到底设置的是什么?
请看过源代码的人给我解答一下,定的也有分送,分不够可以再加。
谢谢!
问题点数:50、回复次数:7Top
1 楼fct0906(bighammer)回复于 2005-03-11 10:46:41 得分 5
楼主多努力吧!
0号节点不能用就像0指针一样.至于把0号节点最低位置1是为了方便程序的其它部分处理.我没看过minix的源码, 这是我的猜测.Top
2 楼tengulre(debian core developer)回复于 2005-03-11 12:33:19 得分 0
upTop
3 楼anglechen(啊健)回复于 2005-03-11 12:54:40 得分 0
关注Top
4 楼keyinwind(winds)回复于 2005-03-13 15:41:24 得分 20
以下载自《MINIX:操作系统设计与实现》
逻辑上,在创建文件时,文件系统必须在位图块中查找第一个空闲i-节点,把它分配给这个新创建的文件。然而,超级块在内存的拷贝中有一个域指向第一个空闲 i-节点,因此不必进行查找,在该空闲i-节点分配使用后,就需要修改指针,使它指向下一个空闲i-节点,往往是下一个或者较近的一个节点。同样地, i-节点被释放后,检查这个i-节点是否位于第一个空闲i-节点的前面,若是,则需要修改指向第一个空闲i-节点的指针。如果磁盘上的所有i-节点全被使用,查找函数返回0,这也是0号i-节点未使用的原因(即它可以用于表明查找失败)(在mkfs创建新文件时,它把0号i-节点清零,并把位图中的最低位设置为1,防止文件系统分配0号i-节点)。上面所讲的同样也适用于区段位图。逻辑上,申请空间时,需要在区段位图中查找第一个空闲区段,但是超级块的内存拷贝保存了指向第一个空闲区段的指针,因而消除了很多顺序查找位图的麻烦。
仅仅是为了方便...我是这么认为Top
5 楼linxiaquansheng(林下泉声)回复于 2005-03-14 22:19:24 得分 5
谢谢楼上所载!
我也有几个问题想请教一下。
1、在linux 0.11的超级块结构中哪个域是指向第一个空闲i-节点?
2、文件系统魔术字段有什么作用?
Top
6 楼viyar(云烟不倒)回复于 2005-03-18 14:06:03 得分 20
inode号从1开始,1为bad_block_inode ,就是说这个inode所链接的数据块全部是已损坏的,不能正常使用的block
2为挂载点inode号。2-10都为保留用作特殊用途的
空闲inode没有域指向的,超级块中只有记录还有多少空闲inode
魔术字段是用来标示你的文件系统的,每一个文件系统按照它的名字以16进制进行转换得到它自己的魔术字段,所以字段如果错误,mount就会失败,文件系统也就使用不了了
这些是我看ext3得出的结论,和minix应该不会差太多Top
7 楼hbxufenghua(从之西门吹雪)回复于 2005-03-29 09:24:04 得分 0
首先谢谢大家的回帖,我前段时间由于忙其他事情,所以一直都没有时间来回帖。
今天看了大家的回帖再结合了数据结构中的一点知识,我觉得应该是这样的:
设0号节点为0肯定是为了方便,因为系统搜索空闲的i节点时肯定是从0号节点开始的,
0号节点设成0就相当于搜索结果的初始值为0,这样在系统无空闲节点时,搜索结果因为
没有在中途改变,所以还是等于原来赋的初值0,这就省去了对搜索结果进行再处理的过程。
Top




