電腦電源一啟動,第一個載入的是BIOS,它是一個ROM IC (Read-Only Memory),而儲存於read-only的program稱作Firmware .
BIOS執行會先對電腦進行自我檢測POST (power-on self test),檢測ending時候,BIOS嘗試讀取軟碟第一個磁區,若讀取不到則嘗試
讀取硬碟第一個磁區,MBR則會被載入到記憶體 0000 : 7C00 位置開始執行,接著載入作業系統提供的開機磁區(Boot Sector)並
進入OS . 流程大致如下圖 :
MBR指的是硬碟最開頭第一個磁區,位於硬碟第0面、第0軌、第1磁區,每個磁區為512Bytes
BIOS提供的 INT 13h 中斷服務程式讀寫MBR磁區 :
MOV AX,0201h
MOV BX,200h
MOV CX,0001h
MOV DX,0080h
INT 13h
利用上述這段程式將MBR磁區載入到memory 200h 的位置
MBR Sector divided in three parts ,
---------------------------- <-- displacement value 00H ( 0 bytes )
boot partition loader
這一小段程是用來將可啟動的
作業系統分割區載入
---------------------------- <----------------- displacement value 1BEh ( 446 Bytes )
partition table
磁碟分割表
55AA
---------------------------- <----------------- displacement value 200H ( 512 Bytes )
1.第一個區域是程式區,稱Boot Partition Loader (Pre-Load or Pre-Boot),載入可啟動作業系統分割區的
啟動磁區(boot sector),並將控制權交給啟動磁區,range : 000h ~ 1BDh 一共446 Bytes
在不考慮軟碟情況下,除了BIOS之外會最先被電腦載入執行的區域 e.g multi-boot manager 、 opened-type virus 、HDD software lock
都是利用這個區域在工作 .
2.第二個區域是資料區,即硬碟分割表所在區域, range 1BEh ~ 1FDh 一共 64 Bytes
64 bytes又劃分4個區域,代表4個磁碟分割表,及範圍分別為:
displacement value 01BE ~ 01CD (第一分割表)
displacement value 01CE ~ 01DD (第二分割表)
displacement value 01DE ~ 01ED (第三分割表)
displacement value 01EE ~ 01FD (第四分割表)
因為只有64 Bytes,只能切成4個分割表,所以這也是為何在使用FDISK時最多只能切成4個主分割(primary partition)的原因
(擴充分割 extended 也算主分割的一種)
萬一硬碟第0軌(MBR)發生實體損壞,這顆硬碟就報廢了,原因就是OS讀區不到partition table的關係 .
3.第三個區域只有 2 bytes,displacement value 1FE fix 55h
displacement value 1FF fix AAh
55AA只是讓BPL程是用來驗證是否為MBR磁區
完整MBR磁區範例 :
Rad part : Program sector
Blue part : The first partition table
Green part : The second partition table
Pink part : The thied partition table
Purple part : The fourth partition table
Light Green part : Mark of MBR
0000 : 7C00 33 C0 8E D0 BC 00 7C FB-50 07 50 1F FC BE 1B 7C 3.....l.P.P.....l
0000 : 7C10 BF 1B 06 50 57 B9 E5 01-F3 A4 CB BS BE 07 B1 04 ...PW...........
0000 : 7C20 38 6E 00 7C 09 75 13 83-C5 10 E2 F4 CD 18 8B F5 8n.l.u..........
0000 : 7C30 83 C6 10 49 74 19 38 2C-74 F6 A0 B5 07 B4 07 8B ...iT.8,t.......
0000 : 7C40 F0 AC 3C 00 74 FC BB 07-00 B4 0E CD 10 EB F2 88 ..<.t...........
0000 : 7C50 4E 10 E8 46 00 73 2A FE-46 10 80 7E 04 0B 74 0B N..F.s*.F..~..t.
0000 : 7C60 80 7E 04 0C 74 05 A0 B6-07 75 D2 80 46 02 06 83 .~..t....u..F...
0000 : 7C70 46 08 06 83 56 0A 00 E8-21 00 73 05 A0 B6 07 EB F...V...!.s.....
0000 : 7C80 BC 81 3E FE 7D 55 AA 74-0B 80 7E 10 00 74 C8 A0 ..>.}U.t..~..t..
0000 : 7C90 B7 07 EB A9 8B FC 1E 57-8B F5 CB BF 05 00 8A 56 ........W.......V
0000 : 7CA0 00 B4 08 CD 13 72 23 8A-C1 24 3F 98 8A DE 8A FC .....r#..$?.....
0000 : 7CB0 43 F7 E3 8B D1 86 D6 B1-06 D2 EE 42 F7 E2 39 56 C..........B..9V
0000 : 7CC0 0A 77 23 72 05 39 46 08-73 1C B8 01 02 BB 00 7C .w#r.9F.s......l
0000 : 7CD0 8B 4E 02 8B 56 00 CD 13-73 51 4F 74 4E 32 E4 8A .N..V...sQOtN2..
0000 : 7CE0 56 00 CD 13 EB E4 8A 56-00 60 BB AA 55 B4 41 CD V......V.`..U.A.
0000 : 7CF0 13 72 36 81 FB 55 AA 75-30 F6 C1 01 74 2B 61 60 .r6..U.u0...t+a`
0000 : 7D00 6A 00 6A 00 FF 76 0A FF-76 08 6A 00 68 00 7C 6A j.j..v..v.j.h.lj
0000 : 7D10 01 6A 10 B4 42 8B F4 CD-13 61 61 73 0E 4F 74 0B .j..B....aas.Ot.
0000 : 7D20 32 E4 8A 56 00 CD 13 EB-D6 61 F9 C3 49 6E 76 61 2..V.....a..Inva
0000 : 7D30 6C 69 64 20 70 61 72 74-69 74 69 6F 6E 20 74 61 lid partition ta
0000 : 7D40 62 6C 65 00 45 72 72 6F-72 20 6C 6F 61 64 69 6E ble.Error loadin
0000 : 7D50 67 20 6F 70 65 72 61 74-69 6E 67 20 73 79 73 74 g operating syst
0000 : 7D60 65 6D 00 4D 69 73 73 69-6E 67 20 6F 70 65 72 61 em.Missing opera
0000 : 7D70 74 69 6E 67 20 73 79 73-74 65 6D 00 00 00 00 00 ting system.....
0000 : 7D80 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000 : 7D90 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000 : 7DA0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000 : 7DB0 00 00 00 00 00 2C 44 63-01 00 00 00 72 20 80 01 .....,Dc....r ..
0000 : 7DC0 01 00 0B EF BF 1D 3F 00-00 00 A1 0B 7D 00 00 00 ......?.....}...
0000 : 7DD0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000 : 7DE0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000 : 7DF0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA ..............U.
硬碟分割表的格式 :
每個分表佔16 Bytes 其意義如下 :
Displacement value | Size | Explanation
00 byte Boot ID . 若為可開機的分割區則為 80h ~FFh,若否則為 00h
80h = C, 81h = D, 82h = E ... 以此類推
以fdisk來說,若第一顆硬碟的分割區設為Active,則ID = 80h
四個分割表中,只能有一個被設為可開機,否則將發生錯誤
01h byte 此分割開始之磁頭編號
02h byte 此分割開始之磁區編號 (6 bytes )
最高的 2個 bytes ( bit 6-7 ),為磁柱編號的 bit 8-9
03h byte 此分割開始之磁柱編號 ( 10 bits )
bit 8-9 放在位移值 02h的bit 6-7
04h byte 作業系統識別碼
00 None
01 DOS FAT-12 bits
02 XENIX root
03 XENIX usr
04 DOS FAT-16 bits < 32M
05 Extended
06 DOS FAT-16 bits ? 32M
07 HPFS/NTFS
08 AIX
09 AIX bootable
0A OS/2 Boot Manager
0B DOS FAT-32 bits (Int 13h extensions)
0C DOS FAT Cylinder >1024 (Int 13h extensions)
0E DOS FAT System (Int 13h extensions)
0F DOS BigExtended (Int 13h extensions)
20 SPF Boot manager
40 Venix 80286
41 PPC PReP Boot
51 Novell
52 Microport
63 GNU HURD
64 Novell Netware
65 Novell Netware
75 PC/IX
80 Old MINIX
81 Linux/MINIX
82 Linux swap
83 Linux native
85 Linux extended
93 Amoeba
94 Amoeba BBT
A5 FreeBSD
A6 Open BSD
A7 NETSTEP
A9 NetBSD
B7 BSDI fs
B8 BSDI swap
C7 Syrinx
DB CP/M
E1 DOS access
E3 DOS R/O
EB BeOS fs
F2 DOS secondary
FF BBT
05h byte 此分割結束之磁頭編號
06h byte 此分割結束之磁區編號 (6bits )
最高的2個 bits (bit 6-7),為磁柱編號的 bit 8-9
07h byte 此分割結束之磁柱編號 ( 10 bits )
bit 8-9 放在位移值 06h的bit 6-7
08h DWord 此分割區前之磁區總數
12h DWord 此分割之磁區總數
FDISK/MBR 的作用 :
Windoes / DOS 作業系統提供的硬碟分割成是有一個隱藏參數 /mbr,其實Fdisk /mbr 重建
硬碟分割表示錯誤的,Fdisk /mvr 主要功用在重建BPL (Boot Partition Loador),也就是
Fdiosk只幫你重建程式區而已 ,如果硬碟分割表損毀那麼Fdisk /mbr就沒用了 .
也因為 /mbr的功用在重建BPL程式區,而許多的多重開機管理程式或開機型病毒也是利用
這個區域在工作,所以,執行 Fdisk /mbr可能可以移除多重開機管理程式或開機型病毒 .
Boot Partition Loader 程式說明 (WinXP)
首先要知道BIOS結束self test後,會將MBR載入至記憶體 0000 : 7C00 location,然後開始
執行MBR程式區裡的程式。
為何會fix將MBR載入至記憶體 0000 : 7C00的位置呢? 原因是以前IBM出的x86系統
的BIOS就是這樣研發
MBR程式的第一部分
設定堆疊並將MBR程是從 0000 :7C00h copy到 0000 : 0600h 位置
將程式碼由 0000 : 7C00h 複製到 0000:0600h 的原因在於後續載入的
啟動磁動(Boot Sector) . 也逼須備載入到 0000 : 7C00h 的位置
如果未進行搬移的動作,將造成在記憶中的MBR程是被覆蓋而造成當機 .
0000:7C00 33C0 XORAX,AX
0000:7C02 8ED0 MOVSS,AX
0000:7C04 BC007C MOVSP,7C00; 設定堆疊 SS:SP (0000:7C00)
0000:7C07 FB STI
0000:7C08 50 PUSH AX
0000:7C09 07 POPES
0000:7C0A 50 PUSH AX
0000:7C0B 1F POPDS; DS = ES = AX = 0
0000:7C0C FC CLD
0000:7C0D BE1B7C MOVSI,7C1B
0000:7C10 BF1B06 MOVDI,061B
0000:7C13 50 PUSH AX; AX = 0000
0000:7C14 57 PUSH DI; DI = 061B
0000:7C15 B9E501 MOVCX,01E5
0000:7C18 F3 A4 REPZ MOVSB; 將第二部份的程式與硬碟分割表複製到記憶體 0000:061Bh 位置
0000:7C1A CB RETF; 跳到新位置繼續執行, 也就是
; MBR 程式的第二部份起始點 (0000:061B)
;MBR 程式第二部份
0000:7C1B BDBE07 MOVBP,07BE; BP = 07BEh = 第一個硬碟分割表位址
0000:7C1E B104 MOVCL,04; CL = 4, 最多共有 4 組分割表
0000:7C20 386E00 CMP[BP+00],CH; CH = 0
0000:7C23 7C09 JL7C2E; 如果 BootID 等於 80h ~ FFh (可開機分割表)
; 則跳到 7C2E 位址繼續檢查其它的分割表
0000:7C25 7513 JNZ7C3A ; 如果 BootID 等於 01h ~ 7Fh, 則顯示
; Invalid partition table 錯誤訊息
0000:7C27 83C510 ADDBP,+10 ; 讀取下一分割表
0000:7C2A E2F4 LOOP 7C20 ; 繼續檢查下一分割表
0000:7C2C CD18 INT18; 在 4 個分割表中都沒找到可啟動分割區, 執行ROM BASIC
0000:7C2E 8BF5 MOVSI,BP; SI=BP=可開機的分割表
0000:7C30 83C610 ADDSI,+10; 下一分割表
0000:7C33 49 DECCX; 4 個分割表都檢查過了?
0000:7C34 7419 JZ7C4F; 是, 跳到 7C4F 繼續執行
0000:7C36 382C CMP[SI],CH; 如果 BootID 等於 0
0000:7C38 74F6 JZ7C30; 是, 繼續檢其它分割表
; 否, 顯示 Invalid partition table 錯誤訊息
0000:7C3A A0B507 MOVAL,[07B5]; [07B5]=2Ch=Point to 'Invalid partition table' error message
; -----------------------------------------------------
; 顯示錯誤訊副程式
0000:7C3D B407 MOVAH,07
0000:7C3F 8BF0 MOVSI,AX;
0000:7C41 AC LODSB; 讀取下個字元
0000:7C42 3C00 CMPAL,00; 字串已顯示完畢 ?
0000:7C44 74FC JZ7C42; 是, 進入無窮迴圈
0000:7C46 BB0700 MOVBX,0007
0000:7C49 B40E MOVAH,0E;
0000:7C4B CD10 INT10; 顯示一個字元
0000:7C4D EBF2 JMP7C41; 繼續顯示
; 顯示錯誤訊副程式結束
; -----------------------------------------------------
; 這埵閉q奇怪的程式碼, 不明白有什麼特殊原因要將分割表開始之磁區位移6個磁區
; 總之這段 code 在戴入 Boot Sector 時會先根據 Partition Table 的內容戴入 Boot Sector
; 如果戴入失敗 或者 戴入的磁區 不是 Boot Sector, 則將分割表開始數 + 6
; 然後再一次嘗試戴入 Boot Sector
0000:7C4F 884E10 MOV[BP+10],CL; CL=0, 將下一個 Partition Table 的 BootID 設為 00h
; 在這堻o個 byte 當成特殊旗標使用, 用來判斷 分割開始之磁區數
; 是否有作位移6個磁區的動作
0000:7C52 E84600 CALL 7C9B; 戴入 Boot Sector
0000:7C55 732A JNB7C81; Boot Sector 戴入成功, 跳到 7C81
0000:7C57 FE4610 INCBYTE PTR [BP+10]; 將下一個 Partition Table 的 BootID+1
0000:7C5A 807E040B CMPBYTE PTR [BP+04],0B; 檢查作業系統格式是否為DOS FAT-32 bits
0000:7C5E 740B JZ7C6B; 是
0000:7C60 807E040C CMPBYTE PTR [BP+04],0C; 檢查作業系統格式是否為DOS FAT Cylinder > 1024
0000:7C64 7405 JZ7C6B; 是
0000:7C66 A0B607 MOVAL,[07B6]; [07B6]=44h=Point to "Error loading operation system"
0000:7C69 75D2 JNZ7C3D; 顯示錯誤訊息
0000:7C6B 80460206 ADDBYTE PTR [BP+02],06; 此分割表開始磁區數位移 6 個磁區
0000:7C6F 83460806 ADDWORD PTR [BP+08],+06; 此分割區前之磁區總數 + 6
0000:7C73 83560A00 ADCWORD PTR [BP+0A],+00
0000:7C77 E82100 CALL 7C9B; 再次嘗試讀入 Boot Sector
0000:7C7A 7305 JNB7C81; Boot Sector 戴入成功
0000:7C7C A0B607 MOVAL,[07B6]; [07B6]=44h=Point to "Error loading operation system"
0000:7C7F EBBC JMP7C3D; 顯示錯誤訊息
0000:7C81 813EFE7D55AA CMPWORD PTR [7DFE],AA55; 檢查 BootSector ID 55AAh
0000:7C87 740B JZ7C94; 確實是 Boot Sector, 轉移控制權
0000:7C89 807E1000 CMPBYTE PTR [BP+10],00; 不是 Boot Sector, 則判段是否做過開始磁區數位移的動作
0000:7C8D 74C8 JZ7C57; 沒位移, 則進行位移, 然後再嘗試讀戴入 Boot Sector
0000:7C8F A0B707 MOVAL,[07B7]; [07B7]=63h=Point to "Missing operation system" error message
0000:7C92 EBA9 JMP7C3D; 顯示錯誤訊息
0000:7C94 8BFC MOVDI,SP; DI=SP=7C00
0000:7C96 1E PUSH DS; DS=0000
0000:7C97 57 PUSH DI; DI=7C00
0000:7C98 8BF5 MOVSI,BP; SI=BP=Paration Table
0000:7C9A CB RETF; 轉移控制權給 Boot Sector
; MBR 程式到止結束, 進入作業系統
; -------------------------------------------------------------
; 戴入 Boot Sector 副程式
0000:7C9B BF0500 MOVDI,0005
0000:7C9E 8A5600 MOVDL,[BP+00]; Drive number, 80h = drive 0, 81h = drive 1
0000:7CA1 B408 MOVAH,08
0000:7CA3 CD13 INT13; Get Drive parameters
; Input:
; ah=08h
;dl=00h ~ 7fh : Floppy
;dl-80h ~ FFh : Harddisk
; on return:
;ah=status of command executed
;bl=drive type
;ch=Lower 8 bits of maximum cylindernumber
;cl=bits 6-7 : Highest 2 bits of maximum cylindernumber
; bits 0-5 : Maximum sectornumber
;dh=max heads
;dl=number of drivers attached
;es:di pointer to 11 byte Disk Base Table (DBT)
;cf=1 if error
0000:7CA5 7223 JB7CCA; 讀取磁碟參數失敗, 跳到 7CCA 繼續執行
0000:7CA7 8AC1 MOVAL,CL; AL=CL=每軌磁區數
0000:7CA9 243F ANDAL,3F
0000:7CAB 98 CBW
0000:7CAC 8ADE MOVBL,DH; BL=DH=磁頭數
0000:7CAE 8AFC MOVBH,AH; BH=AH=00h
0000:7CB0 43 INCBX
0000:7CB1 F7E3 MULBX; AX: DX = 磁頭數 * 每軌磁區數
0000:7CB3 8BD1 MOVDX,CX;
0000:7CB5 86D6 XCHG DL,DH; DH=max sector, DL=max cylinder
0000:7CB7 B106 MOVCL,06
0000:7CB9 D2EE SHRDH,CL;
0000:7CBB 42 INCDX; DX=Total cylinder
0000:7CBC F7E2 MULDX; AX: DX = Total Sectors (磁頭數 * 每軌磁區數 * 磁軌數 )
0000:7CBE 39560A CMP[BP+0A],DX; [BP+0A]=此分割區前之磁區總數 (high word)
0000:7CC1 7723 JA7CE6; 如果 分割區前之磁區總數 大於 Total Sectors
; 代表這可能是一顆大容量硬碟, 跳到 7CE6 位置嘗試使用
; int13 Extended Read Function 讀取資料
0000:7CC3 7205 JB7CCA; jump, 非大容量硬碟
0000:7CC5 394608 CMP[BP+08],AX; [BP+0A]=此分割區前之磁區總數 (low word)
0000:7CC8 731C JNB7CE6; 如果 分割區前之磁區總數 大於 Total Sectors
; 代表這可能是一顆大容量硬碟, 跳到 7CE6 位置嘗試使用
; int13 Extended Read Function 讀取資料
0000:7CCA B80102 MOVAX,0201; 讀取 Boot Sector 到記憶體 0000:7C00h
0000:7CCD BB007C MOVBX,7C00;
0000:7CD0 8B4E02 MOVCX,[BP+02];
0000:7CD3 8B5600 MOVDX,[BP+00];
0000:7CD6 CD13 INT13;
0000:7CD8 7351 JNB7D2B; 讀取成功, 離開
0000:7CDA 4F DECDI; 如果讀取 5 次都失敗
0000:7CDB 744E JZ7D2B; 則離開
0000:7CDD 32E4 XORAH,AH; 重置磁碟
0000:7CDF 8A5600 MOVDL,[BP+00];
0000:7CE2 CD13 INT13;
0000:7CE4 EBE4 JMP7CCA; 繼續嘗試讀入 Boot Sector
0000:7CE6 8A5600 MOVDL,[BP+00]; Drive number, 80h = drive 0, 81h = drive 1...
0000:7CE9 60 PUSHA
0000:7CEA BBAA55 MOVBX,55AA; Check for Extension support:
0000:7CED B441 MOVAH,41; Input: AH = 41h
0000:7CEF CD13 INT13; BX = 55AAh
; DL = Drive Number
; Output: CF = 0 - operation successfully completed
; AH - major version of extensions
; AL - minor version of extensions
; BX = 0AA55h
; CX = Bits 15 to 2 - reserved (set to 0)
; Bits 1 = 0 - Removable-media control is not supported
; = 1 - Removable-media control is supported
; Bits 0 = 0 - Extended disk access is not supported
; = 1 - Extended disk access is supported
; CF = 1 - operation failed
; AH - Status of operation
0000:7CF1 7236 JB7D29; Int 13 not supported Extension, return
0000:7CF3 81FB55AA CMPBX,AA55
0000:7CF7 7530 JNZ7D29; Failed, return
0000:7CF9 F6C101 TEST CL,01
0000:7CFC 742B JZ7D29; Extended disk access is not supported, return
0000:7CFE 61 POPA
0000:7CFF 60 PUSHA
; Extended Read:
; Input: AH = 42h
; DL = Drive Number
; DS:SI = Disk-address packet
; Output: CF = 0 - operation successfully completed
; 1 - operation failed
; Format of disk address packet:
; Offset Size Description
; -----------------------
; 00h BYTE 10h (size of packet)
; 01h BYTE reserved (0h)
; 02h BYTE number of blocks to transfer
; 03h BYTE reserved (0h)
; 04h DWORD -> transfer buffer
; 08h QWORD starting logical block address
0000:7D00 6A00 PUSH 0000; Start logical block address= 分割表中的 此分割區前之磁區總數
0000:7D02 6A00 PUSH 0000;
0000:7D04 FF760A PUSH [BP+0A];
0000:7D07 FF7608 PUSH [BP+08];
0000:7D0A 6A00 PUSH 0000; Transfer Buferr=0000:7C00h
0000:7D0C 68007C PUSH 7C00;
0000:7D0F 6A01 PUSH 0001; Number of Blocks to transfer = 1, reserved = 0
0000:7D11 6A10 PUSH 0010; Set packet size = 10h, Reserved = 00h
0000:7D13 B442 MOVAH,42
0000:7D15 8BF4 MOVSI,SP
0000:7D17 CD13 INT13; 讀取 Boot Sector
0000:7D19 61 POPA
0000:7D1A 61 POPA
0000:7D1B 730E JNB7D2B; 讀取成功, 離開
0000:7D1D 4F DECDI; 如果讀取 5 次都失敗
0000:7D1E 740B JZ7D2B; 則離開
0000:7D20 32E4 XORAH,AH; 重置磁碟
0000:7D22 8A5600 MOVDL,[BP+00];
0000:7D25 CD13 INT13;
0000:7D27 EBD6 JMP7CFF; 再次嘗試讀取
0000:7D29 61 POPA
0000:7D2A F9 STC
0000:7D2B C3 RET
; 戴入 Boot Sector 副程式結束
; -------------------------------------------------------------
; Boot Paration Loader 到止結束
; -------------------------------------------------------------
留言列表