|
楼主 |
发表于 2009-3-5 10:25:26
|
显示全部楼层
OpenBSD超级块实例分析
图6.4是一个OpenBSD的超级块,它位于文件系统的16号扇区,大小为4个扇区(其中省略掉了全部为0的部分,同时为了偏移值的叙述方便,我们将其保存成了一个文件)。
注意:这个文件系统来自于一个IA32系统,所以多字节数据的排列使用little-endian顺序。如果这个文件系统是来自于使用big-endian顺序的系统,比如说Sparc,则各个数值的字节排列顺序将会颠倒过来。
具体分析如下。
1) 0x55C~0x55F字节为UFS1超级块签名标志“54190100”,它位于UFS1超级块的第三个扇区内。
提示:可以使用Winhex搜索位于扇区内偏移348字节处的“54190100”来寻找UFS1文件系统超级块的大致位置。
2) 0x08~0x0B字节显示各柱面组中的备份超级块位于相对于该柱面组基准位置16片段(0x10)处。
3) 0x0C~0x0F字节显示柱面组描述符位于相对于基准位置24片段(0x18)处。
4) 0x10~0x13字节显示i-节点表起始于相对于基准位置32片段处(0x20)。
5) 计算柱面组的基准位置:由0x18~0x1B字节处可知偏转增量值为32(0x20),也就是说0号组的基准位置位于该组的起始片段,1号组的基准位置位于距该组起始处32片段的位置。超级块的0x1C~0x1F字节显示偏转周期掩码为0xFFFFFFF0,该值换算成二进制为“11111111111111111111111111110000”,我们看到后4位为0,也就是说我们只需要关心组号的最后4个bit即可,也就是循环周期为16。因此,每经过16个组,柱面组的基准位置就回到该组的起始片段处。例如,15号柱面组的基准位置位于距该组起始处480片段处,而16号柱面组的基准位置则又转回到了该组的起始处。
6) 0x20~0x23字节为最后写入时间,支持的时间范围从格林威治时间1970年1月1日开始。
7) 0x24~0x27字节表示在这个文件系统中共有10,000(0x2710)个片段。
8) 字节0x2C~0x2F显示这个文件系统只有两个柱面组。
9) 0x30~0x33字节为每块大小字节数,我们看到它的值为8,192字节(0x2000)。
10) 片段大小字节数位于0x34~0x37字节处,显示大小为1,024字节(0x0400)。
11) 每块片段数保存在0x38~0x3B字节处,值为8。
12) 0x68~0x6B字节显示超级块大小为2,048字节(0x0800)。
13) 0x98~0x9B字节给出了柱面组摘要区的位置,它位于文件系统的272片段处。
14) 柱面组摘要区的大小描述保存在0x9C~0x9F,值为1,024字节,即一个片段。
15) 0xB8~0xBB字节处为每柱面组i-节点数,值为1,920(0x0780)。
16) 每柱面组块数保存在0xBC~0xBF字节处,为3064(0x1f80)。
17) 从0xD0字节开始为标志:
 第一个字节为0说明超级块最后修改时间之后又有过写入操作。
 0xD2~0xD3字节的标志为默认值。
 0xD4字节开始为最后挂载点,本文件系统最后挂载点为 / mnt / 。其它区域不再讨论。 |
|