Ext3文件系统以块作为数据存储的基本单位,文件系统中的所有块被分为若干个组,即块组,块的分配情况由该块所在块组的块位图描述。块位图有以下特点:
①每个块组中都有一个块位图,块位图的地址在该块组的描述符中给出。
②对于含有超级块、块组描述符表的块组,或含有超级块备份、块组描述符表备份的块组,块位图起始于块组描述符表所在块的下一个块;对于没有超级块备份和块组描述符表备份的块组,块位图起始于该块组的第一个块。
③在创建文件系统时,操作系统将每个块组包含的块数与每个块包含的位数设置为相等,这使得块位图刚好占用一个完整的块。
④块位图用于描述本块组所管理的块的分配状态,块位图中的每一位映射本块组中的一个块。如果某个块对应的位没有设置,那么代表该块未分配,可以用于存储数据;否则,代表该块已经存放了数据或者该块不能够使用。
⑤因为块位图中的每一位映射本块组中的一个块,所以每个字节映射8个块,这8个块中的第一个块对应字节中的最低位。例如,块位图中有一个字节为FEH,换算为二进制等于11111110,这个值的最低位是0,就说明其映射的8个块中,第一个块是空闲的,其他7个块已经使用。
在图7-34的块组描述符例子中,1号块组描述符的具体参数值如图7-35所示。
从图中可以看到1号块组的块位图起始于32 770号块,我们就以这个块位图为例进行分析。用WinHex跳转到32 770号块,其内容如图7-36所示。
图中大部分数据都是“FF”,表示它们所映射的块是被分配的。在偏移量243CH处画圈的值为“9FH”,换算为二进制等于“10011111”,那么这8个位映射哪8个块呢?下面我们来做换算。
第1步 计算“9FH”在该块位图中的相对偏移量。
这需要用其当前的偏移量减去块位图的起始偏移量,即243CH−2000H=43CH,换算成十进制等于1084。
第2步 计算“9FH”在该块组中映射的8个块号。
因为“9FH”在块位图中的相对偏移量为1084,所以它在该块组中映射的第一个块的块号为1084×8=8672,其后连续的7个块也都是“9FH”的映射块,即这8个映射块为8672~8679号块。
第3步 计算“9FH”在该文件系统中映射的8个块号。
上一步计算出的8672~8679这8个块是“9FH”这个值在1号块组中映射的相对块号,并不是整个文件系统的绝对块号,如果要把块组中的相对块号换算为文件系统的绝对块号,换算公式为:
文件系统的绝对块号=块组的相对块号+块组在文件系统中的起始块号
从超级块中可知每块组包含32 768个块,所以1号块组起始于文件系统的32 768号块,那么1号块组中的相对块号8672~8679换算为文件系统的绝对块号,应该等于(8672+32 768)~(8679+32 768),即41 440~41 447号块。
现在我们知道了1号块组中块位图值“9FH”(二进制为“10011111”)映射的是文件系统中41 440~41 447号块,二进制值“10011111”与这8个块的具体映射关系及这8个块的分配状态如图7-37所示。