最近接觸到一個 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 |
要說明的是:這里講的“分區”,確切說是:主分區。擴展分區也當成主分區,擴展分區內部的分區信息不在 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 轉換。