最近接触到一个
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
转换。
posted on 2006-10-16 10:32
xiaosilent 阅读(1282)
评论(1) 编辑 收藏 所属分类:
Linux相关