最近接触到一个 0 磁道损坏的硬盘,做数据恢复,有机会学习了一下分区表的结构。在这里简要的做点笔记。
MBR ( Main Boot Record )位于硬盘第一个物理扇区(绝对扇区)柱面 0 ,磁头 0 ,扇区 1 (简化成( 0 , 0 , 1 ))处。由于 DOS 是由柱面 0 ,磁头 1 ,扇区 1 开始,故 MBR 不属于 DOS 扇区, DOS 不能直接访问。 MBR 中包含硬盘的主引导程序和硬盘分区表。分区表有 4 个分区记录区,这也就是我们为什么只能在硬盘里最多拥有 4 个主分区的原因了。记录区就是记录有关分区信息的一张表。它从主引导记录( MBR )偏移地址 01BEH 处连续存放,每个分区记录区占 16 个字节。
下面用我的硬盘的分区表来详细解释一下分区表各区段的具体含义。
偏移位置 |
00 |
01 |
02 |
03 |
04 |
05 |
06 |
07 |
08 |
09 |
0a |
0b |
0c |
0d |
0e |
0f |
00000000 |
33 |
c0 |
8e |
d0 |
bc |
00 |
7c |
fb |
50 |
07 |
50 |
1f |
fc |
be |
1b |
7c |
………… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
000001b0 |
00 |
00 |
00 |
00 |
00 |
2c |
44 |
63 |
60 |
65 |
50 |
65 |
00 |
00 |
80 |
01 |
000001c0 |
01 |
00 |
07 |
fe |
bf |
fc |
3f |
00 |
00 |
00 |
7e |
86 |
bb |
00 |
00 |
00 |
000001d0 |
81 |
fd |
0f |
c5 |
fe |
ff |
bd |
86 |
bb |
00 |
43 |
3b |
6b |
01 |
00 |
00 |
000001e0 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
000001f0 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
55 |
aa |
000 ~ 1bd ( 446 字节)可执行代码区段
1be ~ 1cd ( 016 字节)第一个分区入口(参数解释见下)
1ce ~ 1dd ( 016 字节)第二个分区入口(同第一个分区)
1de ~ 1ed ( 016 字节)第三个分区入口(同第一个分区)
1ee ~ 1fd ( 016 字节)第四个分区人口(同第一个分区)
1fe ~ 1ff ( 002 字节)引导记录标志位(固定值: 55 aa )
要说明的是:这里讲的“分区”,确切说是:主分区。扩展分区也当成主分区,扩展分区内部的分区信息不在 MBR 里面。
要注意的是,在这里出现的数字均是 16 进制数。
下面就分区记录这 16 个字节再详细解释一下,以我的第一个分区为例:
偏移位置 |
00 |
01 |
02 |
03 |
04 |
05 |
06 |
07 |
08 |
09 |
0a |
0b |
0c |
0d |
0e |
0f |
000001b0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
80 |
01 |
000001c0 |
01 |
00 |
07 |
fe |
bf |
fc |
3f |
00 |
00 |
00 |
7e |
86 |
bb |
00 |
|
|
80 分区状态( 80H 表示为激活分区, 00H 表示为非激活分区)
01 分区的开始磁头
01 00 分区的开始柱面和扇区(这个地方有点玄机,等会再详细解释)
07 分区的类型( 0c 表示为 FAT32 , 07 为 NTFS , 0f 代表扩展)
fe 分区的结束磁头
bf fc 分区的结束柱面和扇区(表示同开始磁头,等会详解)
3f 00 00 00 从 MBR 到第一个分区扇区的扇区个数(分区前的扇区数)
7e 86 bb 00 分区的总扇区数
也就是说我的第一个分区是一个从( 0,1,1 )位置开始的可引导的 NTFS 格式的分区。结束位置是( 764,254,63 )容量为: 5.86G 。
下面说一下这些数据具体是怎么得来的。
1b00e 位置的 80 是分区状态,上面已经说清楚了,这里就不再多说。
1b00f 位置的 01 是分区开始的磁头数,磁头数是从 0 到 254 的整数,这里用的是 2 位的十六进制数表示。 (01)HEX=(1)DEC 。
1c000-1c001 位置的 01 00 合在一起,表示的是分区开始的柱面和磁头数。我们知道,一位的 16 进制数可以转换成 4 位的二进制数。那么,将这两个两位的 16 进制数转换分别转换成 2 进制数就是: (01)HEX = (0000 0001)BIN (00)HEX=(0000 0000)BIN 。然后,取前面的 (01)HEX 的二进制的后六位,也就是 (000001)BIN ,他就代表了分区开始的扇区数,也就是 1 。这样取了以后, (01)HEX 还剩下高位的两个数,这两个数放到 (00)HEX 转成的二进制数的前面,就构成了一个 10 位的二进制数,表示的是分区开始的柱面数。到这里,分区开始位置就确定了。
1c002 位置的 07 表示分区类型—— NTFS
1c003-1c005 位置的 fe bf fc 表示分区的结束位置, fe 代表磁头数。 (fe)HEX = (254)10 。然后, (bf)HEX = (1011 1111)BIN (fc)HEX = (1111 1100)BIN ,按照前面说的,取 1011 1111 的后六位,得到 (11 1111)BIN = (63)DEC 也就是说结束的扇区是 63 。最后, (10 1111 1100)BIN = (764)DEC ,即表示结束柱面为 764 。 ( 表示开始和结束位置的这几位,可以说是分区表中最复杂的地方了,看了很多文章,都没怎么讲清楚,希望我这里讲的比较清楚了。 )
1c006-1c009 位置的 3f 00 00 00 表示的是分区前面的扇区数,我们需要倒过来看这串数字,也就是看成 (00 00 00 3f)HEX = (63)DEC ,说明分区开始前的扇区数是 63( 这个分区从 (0,1,1) 位置开始,前面当然就是一个磁头的扇区数 63 了 ) 。
1c00a-1c00d 位置的 7e 86 bb 00 表示的是分区内的扇区总数,和上面一样,倒过来看成是 (00 bb 86 7e)HEX = (12289662)DEC 。扇区总数=(结束柱面-起始柱面+ 1 )×磁头数 (255) ×每柱面扇区数 (63) 。分区容量=扇区数×每扇区字节数 (512) 得到单位为字节,再每除以 1024 ,就向 KByte 、 MByte 、 GByte 转换。