1.標準MBR結構
[](https://img2018.cnblogs.com/blog/389208/201908/389208-20190826171130138-110891109.png)
硬盤的第一個扇區(前512字節)是主引導記錄MBR,其中:
446個字節(偏移0x0000-偏移0x01BD): MBR引導程序代碼
64個字節(偏移0x01BE-偏移0x01FD): 分區表DPT,包含4個16字節的硬盤分區表參數
2個字節(偏移0x1FEH-偏移0x1FFH): MBR簽名,十六進制表示爲“55AA”
2.DPT分區表
一行分區記錄的各字段意義:
————————————————————————————————————————————————————————————
偏移 參數意義
0 80H爲引導分區,00H爲非引導分區
1 2 3 CHS開始位置 (Cylinder的高2位放在Sectors的高2位)
4 分區格式標誌
5 6 7 CHS結束位置
8 9 10 11 本分區前已被佔用扇區數(即該分區的LBA地址),
對於擴展分區表內的分區記錄,
該值相對擴展分區首扇區。
12,13,14,15 本分區佔用扇區數(即分區大小)
————————————————————————————————————————————————————————————
CHS
磁頭號由(1)字節8位表示,其範圍(0 磁頭-254 磁頭)。
扇區號由(2)字節低6位表示,其範圍(1 扇區-63 扇區)。
柱面號由(2)字節高2位 + (3)字節,共10位表示,其範圍(0 柱面 - 1023 柱面)。
當柱面號超過1023時,這10位依然表示成1023,需要注意。
(5,6,7)字節含義同上。(8,9,10,11)字節
如果是主分區表,則這4 個字節表示該分區起始邏輯扇區號與邏輯0扇區(0柱面,0磁頭,1扇區)之差。
如果非主分區表,則這4 個字節要麼表示該分區起始邏輯扇區號與擴展分區起始邏輯扇區號之差,要麼爲63。扇區上的字節是按左邊低位,右邊高位的順序排列的。
所以在取值時,需要把字節再反一下,讓高位字節在左邊,低位字節在右邊,
這一點在讀取邏輯起始扇區號和分區大小時需要注意。
舉個例子:第一項的邏輯起始扇區爲(3F 00 00 00),轉換爲十進制前要先反一下字節順序,
爲(00 00 00 3F)然後在轉換爲十進制,即63.
同理分區大小爲(3F 04 7D 00),先反爲(00 7D 04 3F)再轉換爲十進制,即8193087邏輯扇區號LBA與CHS的相互轉換:
令L = 邏輯扇區號,C = 柱面號,H = 磁頭號,S = 扇區號。
每道扇區數 = 63
每柱面磁頭數 = 255
每柱面扇區數 = 每道扇區數* 每柱面磁頭數 = 63 × 255 = 16065柱面號下標從0開始。磁頭號[0 -- 254],扇區號[1 -- 63]。
邏輯扇區號下標也從0開始。
(柱面,磁頭,扇區)轉換成邏輯扇區號的公式爲:
L = C×16065 + H ×63 + S - 1 ;
比如(1柱面,1磁頭,1扇區),其邏輯扇區號爲:
L = 1×16065 + 1×63 + 1 - 1 = 16128
邏輯扇區號轉換成(柱面,磁頭,扇區) 公式爲:
C = L / 16065
H = (L % 16065) / 63
S = (L % 16065) % 63 + 1
比如邏輯扇區號 16127:
C = 16127 / 16065 = 1
H = (16127 % 16065) / 63 = 0
S = (16127 % 16065) % 63 + 1 = 63
即(1柱面,0磁頭,63扇區)邏輯分區的查找
分區錶鏈實際上相當於一個單向鏈表結構,所以只要找到了一個分區表就可以推導找出其後面所有分區表。
不過該分區表前面的分區表就不好推導出來了。
但令人高興的是這個鏈表的頭節點,也即主分區表的位置是固定的位於(0柱面, 0磁頭, 1扇區)處,
我們可以很輕易的找到它,然後把剩下的所有分區表一一找到。分區格式標誌
字節 分區格式標誌
00 = 分區未使用
01 = DOS主分區 FAT12
02 = XENIX root
03 = XENIX usr
04 = DOS主分區 FAT16 (最大32M)
05 = DOS擴展分區 FAT16
06 = DOS主分區 FA16 big
07 = NTFS / HPFS (Hight Performace File System, 比如 OS/2)
08 = AIX
09 = AIX bootable
0a = OS/2 Boot Manag
0b = WIN95 FAT32
0c = WIN95 FAT32 (LBA)
0e = WIN95 FAT16 (LBA)
0f = WIN95 擴展分區 (LBA)
10 = OPUS
11 = FAT12
12 = Compaq diagnost
14 = FAT16 (32MB) 隱藏分區
16 = FAT16 big 隱藏分區
17 = NTFS / HPFS 隱藏分區
18 = AST Windows swap
1b = WIN95 FAT32 隱藏分區
1c = WIN95 FAT32 (LBA) 隱藏分區
1e = WIN95 FAT16 (LBA) 隱藏分區
24 = NEC DOS
39 = Plan 9
3c = Partition Magic
40 = Venix 80286
41 = PPC PReP boot
42 = SFS
4d = QNX4.x
4e = QNX4.x 2nd partition
4f = QNX4.x 3rd partition
50 = OnTrack DM
51 = OnTrack DM6 Aux
52 = CP/M
53 = OnTrack DM6 Aux
54 = OnTrack DM6
55 = EZ-Drive
56 = Golden Bow
5c = Priam Edisk
61 = Speed Stor
63 = GNU HURD or SYS
64 = Novell NetWare
65 = Novell
70 = Disk Secure Mult
75 = UNIX PC/IX
80 = aktiv (old Minix)
81 = Booten von Laufwerk D: (不一定可行, 需要MBR引導程序支持 (Minix / old LINUX))
82 = LINUX swap
83 = LINUX
84 = OS/2 hidden C:
85 = LINUX extended
86 = NTFS volume set
87 = NTFS volume set
8e = LINUX LVM
93 =http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4179030 Amoebla
94 = Amoebla BBT
9f = BSD/OS
a0 = IBM Thinkpad hidden
a5 = BSD/386
a6 = Open BSD
a7 = NeXT STEP
b7 = BSDI fs
b8 = BSDI swap
c1 = DRDOS/sec (FAT32)
c4 = DRDOS/sec (FAT32(LB))
c6 = DRDOS/sec (FAT16(LB))
c7 = Syrinx
da = Non-Fs data
db = CP/M / CTOS / .
de = Dell Utility
e1 = DOS access
e3 = DOS R/o
e4 = Speed Stor
eb = BeOS fs
ee = EFI GPT
ef = EFI (FAT12/16/32)
f1 = Speed Stor
f2 = DOS secondary
f4 = Speed Stor
fd = LINUX raid auto
fe = LANstep
ff = BBT
3.示例
格式化sdb,找到各分區其中分區表的部分,如下:
========================================================================
Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sdb1 1 10 80293+ 83 Linux
/dev/sdb2 11 22 96390 b W95 FAT32
/dev/sdb3 23 150 1028160 5 Extended
/dev/sdb5 23 30 64228+ 6 FAT16
/dev/sdb6 31 100 562243+ 82 Linux swap / Solaris
/dev/sdb7 101 150 401593+ 7 HPFS/NTFS
/dev/sdb4 * 151 261 891607+ 83 Linux
========================================================================
sdb: 0001 0100 83fe 3f09 3f00 0000 4b73 0200
0000 010a 0bfe 3f15 8a73 0200 0cf1 0200
0000 0116 05fe 3f95 9664 0500 8060 1f00
8000 0196 83fe 7f04 16c5 2400 af35 1b00
sdb3 0001 0116 06fe 3f1d 3f00 0000 c9f5 0100
0000 011e 05fe 3f63 08f6 0100 c628 1100
MBR:
sdb1:[ (00) (01 01 00) (83) (fe 3f 0b) (3f 00 00 00) (4b 73 02 00) ]
(00):表示該分區(sdb1)爲非活動分區
(01 01 00):表示sdb1的起始扇區爲(0柱面,1磁頭,1扇區)
(83):表示文件系統爲ext系列
(fe 3f 0b):表示sdb1的結束扇區爲 fe(16)=254(10) 3f(16)=00111111(2) 0b(16)=00001011(2)
磁頭號:254;
扇區號:111111(2)=63;
柱面號:00 00001011(2)=7;
所以該分區結束扇區爲(7柱面,254磁頭,63扇區)。
(3f 00 00 00):反向,(00 00 00 3F)Hex = 63,sdb1起始邏輯扇區與邏輯0扇區號之差。
表示sdb1前面已有63個扇區,這63個扇區爲系統隱藏扇區。
(4b 73 02 00):反向,(00 02 73 4B)Hex = 160587,表明C盤有160587個扇區。
即(0柱面,1磁頭,1扇區)至(7柱面,254磁頭,63扇區)共有160587個扇區。
sdb2:[ 0000 010a 0bfe 3f15 8a73 0200 0cf1 0200 ]
sdb3:[ (00) (00 01 16) (05) (fe 3f 95) (96 64 05 00) (80 60 1f 00) ]
(00):表示該分區爲非活動分區
(00 01 16):表示sdb3的起始扇區爲(22柱面,0磁頭,1扇區)
(05):表示該分區爲擴展分區
(fe 3f 95):表示sda3的結束扇區爲 fe(16)=254 3f(16)=00 111111(2) 95(16)=1001 0101(2)
磁頭號:254;
扇區號:111111(2)=63;
柱面號:00 1001 0101(2)=149;
所以該分區結束扇區爲(149柱面,254磁頭,63扇區)。
(96 64 05 00):反向,00 05 64 96(16) = 353430
這是真實準確的,我一般都用這一項來定位分區起點。
(80 60 1f 00):反向,00 1f 60 80(16) = 2056320
可以推導出擴展分區的結束位置:353430 + 2056320 = 2409750號扇區,即(149柱面,254磁頭,63扇區)。
sdb4:[ (80) (00 01 96) (83) (fe 7f 04) (16 c5 24 00) (af 35 1b 00) ]
(16 c5 24 00):反向,00 24 c5 16(16) = 2409750 = 353430 + 2056320
(af 35 1b 00):反向,00 1b 35 af(16) = 1783215
1783215 + 2409750 = 4192965
(1783215 + 2409750) * 512= 2146798080
2147483648 - 2146798080 = 685568
685568/512 = 1339
sdb3 0001 0116 06fe 3f1d 3f00 0000 c9f5 0100
0000 011e 05fe 3f63 08f6 0100 c628 1100
dd if=/dev/sdb of=./sdb5 bs=512 count=1 skip=353430
dd if=/dev/sdb3 of=./sdb3 bs=512 count=1
SDB3:
sda5:[ 0001 0116 06fe 3f1d 3f00 0000 c9f5 0100 ]
(3f 00 00 00):反向,00 00 00 3f(16) = 63
(c9 f5 01 00):反向,00 01 f5 c9(16) = 128457
[ 0000 011e 05fe 3f63 08f6 0100 c628 1100 ]
(08f6 0100):反向,00 01 f6 08(16) = 128520 = 63 + 128457
(c628 1100):反向,00 11 28 c6(16) = 1124550
sdb6:[ 0001 011e 82fe 3f63 3f00 0000 8728 1100 ]
(3f 00 00 00):反向,00 00 00 3f(16) = 63
(87 28 11 00):反向,00 11 28 87(16) = 1124487 = 1124550 - 63
[ 0000 0164 05fe 3f95 ce1e 1300 b241 0c00 ]
(ce 1e 13 00):反向,00 13 1e ce(16) = 1253070 = 128520 + 1124550
(b2 41 0c 00):反向,00 0c 41 b2(16) = 803250
sdb7:[ 0001 0164 07fe 3f95 3f00 0000 7341 0c00 ]
(3f 00 00 00):反向,00 00 00 3f(16) = 63
(73 41 0c 00):反向,00 0c 41 73(16) = 803187 = 803250 - 63
[ 0000 0000 0000 0000 0000 0000 0000 0000 ]
1253070 + 803250 = 2056320