一. 硬碟結構簡介
1. 硬碟參數釋疑
到目前為止, 人們常說的硬碟參數還是古老的 CHS(Cylinder/Head/Sector)參數. 那麼為什麼要使用這些參數,它們的意義是什麼?它們的取值範圍是什麼?
很久以前, 硬碟的容量還非常小的時候,人們採用與磁碟片類似的結構生產硬碟. 也就是硬碟碟片的每一條磁軌都具有相同的扇區數.由此產生了所謂的3D參數 (Disk Geometry). 既磁頭數(Heads), 柱面數(Cylinders),扇區數(Sectors),以及相應的定址方式.
其中:
磁頭數(Heads)表示硬碟總共有幾個磁頭,也就是有幾面碟片, 最大為 255 (用 8 個二進位位儲存);
柱面數(Cylinders) 表示硬碟每一面碟片上有幾條磁軌,最大為 1023(用 10 個二進位位儲存);
扇區數(Sectors) 表示每一條磁軌上有幾個扇區, 最大為 63(用 6個二進位位儲存).
每個扇區一般是 512個位元組, 理論上講這不是必須的,但好象沒有取別的值的.
所以磁碟最大容量為:
255 * 1023 * 63 * 512 / 1048576 = 8024 GB ( 1M =1048576 Bytes )或硬碟廠商常用的單位:
255 * 1023 * 63 * 512 / 1000000 = 8414 GB ( 1M =1000000 Bytes )
在 CHS 定址方式中, 磁頭, 柱面, 扇區的取值範圍分別為 0到 Heads - 1,0 到 Cylinders - 1, 1 到 Sectors (注意是從 1 開始).
2. 基本 Int 13H 調用簡介
BIOS Int 13H 調用是 BIOS提供的磁碟基本輸入輸出中斷調用, 它可以完成磁碟(包括硬碟和磁碟片)的複位, 讀寫, 校正, 定位, 診斷,格式化等功能.它使用的就是 CHS 定址方式, 因此最大識能訪問 8 GB 左右的硬碟 (本文中如不作特殊說明, 均以 1M = 1048576 位元組為單位).
3. 現代硬碟結構簡介
在老式硬碟中, 由於每個磁軌的扇區數相等,所以外道的記錄密度要遠低於內道, 因此會浪費很多磁碟空間 (與磁碟片一樣). 為瞭解決這一問題,進一步提高硬碟容量, 人們改用等密度結構生產硬碟. 也就是說,外圈磁軌的扇區比內圈磁軌多. 採用這種結構後, 硬碟不再具有實際的3D參數,定址方式也改為線性定址, 即以扇區為單位進行定址.
為了與使用3D定址的老軟體相容 (如使用BIOSInt13H介面的軟體), 在硬碟控制器內部安裝了一個地址翻譯器,由它負責將老式3D參數翻譯成新的線性參數. 這也是為什麼現在硬碟的3D參數可以有多種選擇的原因(不同的工作模式, 對應不同的3D參數, 如 LBA, LARGE, NORMAL).
4. 擴充 Int 13H 簡介
雖然現代硬碟都已經採用了線性定址, 但是由於基本 Int13H 的制約, 使用 BIOS Int 13H 介面的程式, 如 DOS 等還只能訪問 8 G以內的硬碟空間.為了打破這一限制, Microsoft 等幾家公司制定了擴充 Int 13H 標準(Extended Int13H), 採用線性定址方式存取硬碟, 所以突破了 8 G的限制,而且還加入了對可拆卸介質 (如活動硬碟) 的支援.
二. Boot Sector 結構簡介
1. Boot Sector 的組成
Boot Sector 也就是硬碟的第一個扇區, 它由 MBR (MasterBoot Record),DPT (Disk Partition Table) 和 Boot Record ID 三部分組成.
MBR 又稱作主引導記錄佔用 Boot Sector 的前 446 個位元組( 0 to 0x1BD ),存放系統主引導程式 (它負責從使用中的磁碟分割中裝載並運行系統引導程式).
DPT 即主要磁碟分割表佔用 64 個位元組 (0x1BE to 0x1FD),記錄了磁碟的基本分區資訊. 主要磁碟分割表分為四個分區項, 每項 16 位元組,分別記錄了每個主要磁碟分割的資訊(因此最多可以有四個主要磁碟分割).
Boot Record ID 即引導區標記佔用兩個位元組 (0x1FE and0x1FF), 對於合法引導區, 它等於 0xAA55, 這是判別引導區是否合法的標誌.
Boot Sector 的具體結構如所示 (參見 NightOwl大俠的文章):
下面還有喔 (39%) │ 結束 ← <q> │ ↑/↓/PgUp/PgDn 移動│ ? 輔助說明 │
0000 ¦------------------------------------------------¦
¦ ¦
¦ ¦
¦ Master Boot Record ¦
¦ ¦
¦ ¦
¦ 主引導記錄(446位元組) ¦
¦ ¦
¦ ¦
¦ ¦
01BD ¦ ¦
01BE ¦------------------------------------------------¦
¦ ¦
01CD ¦ 分區資訊 1(16位元組) ¦
01CE ¦------------------------------------------------¦
¦ ¦
01DD ¦ 分區資訊 2(16位元組) ¦
01DE ¦------------------------------------------------¦
¦ ¦
01ED ¦ 分區資訊 3(16位元組) ¦
01EE ¦------------------------------------------------¦
¦ ¦
01FD ¦ 分區資訊 4(16位元組) ¦
¦------------------------------------------------¦
¦ 01FE ¦01FF ¦
¦ 55 ¦ AA ¦
¦------------------------------------------------¦
2. 分區表結構簡介
分區表由四個分區項構成, 每一項的結構如下:
BYTE State : 分區狀態, 0 =未啟用, 0x80 = 啟用 (注意此項)
BYTE StartHead : 分區起始磁頭號
WORD StartSC : 分區起始扇區和柱面號,底位元組的低6位為扇區號,
高2位為柱面號的第 9,10 位, 高位元組為柱面號的低 8 位
BYTE Type : 分區類型, 如0x0B = FAT32, 0x83 = Linux 等,
00 表示此項未用,07 = NTFS
BYTE EndHead : 分區結束磁頭號
WORD EndSC :分區結束扇區和柱面號, 定義同前
DWORD Relative :線上性定址方式下的分區相對扇區地址
(對於基本分區即為絕對位址)
DWORD Sectors : 分區大小 (總扇區數)
注意: 在 DOS / Windows 系統下,基本分區必須以柱面為單位劃分
( Sectors * Heads 個扇區), 如對於 CHS 為 764/255/63 的硬碟,分區的
最小尺寸為 255 * 63 * 512 / 1048576 = 7.844 MB.
3. 擴充分區簡介
由於主要磁碟分割表中只能分四個分區, 無法滿足需求,因此設計了一種擴充
分區格式. 基本上說, 擴充分區的資訊是以鏈表形式存放的,但也有一些特
別的地方.
首先, 主要磁碟分割表中要有一個基本擴充分區項,所有擴充分區都隸屬於它,
也就是說其他所有擴充分區的空間都必須包括在這個基本擴充分區中.對於
DOS / Windows 來說, 擴充分區的類型為 0x05.
除基本擴充分區以外的其他所有擴充分區則以鏈表的形式級聯存放, 後
一個擴充分區的資料項目記錄在前一個擴充分區的分區表中,但兩個擴充分區
的空間並不重疊.
擴充分區類似於一個完整的硬碟, 必須進一步分區才能使用.但每個擴
展分區中只能存在一個其他分區. 此分區在 DOS/Windows環境中即為邏輯盤.
因此每一個擴充分區的分區表(同樣儲存在擴充分區的第一個扇區中)中最多
只能有兩個分區資料項目(包括下一個擴充分區的資料項目).
擴充分區和邏輯盤的如下:
¦-----------------------¦ --------
¦ 主擴充分區(/dev/hda2) ¦ ^
¦-----------------------¦ ¦
¦ 擴 展 ¦ 分區項1 ¦-- ¦
¦ ¦------------¦ ¦ ¦
¦ 分區表 ¦ 分區項 2 ¦--+-- ¦
¦-----------------------¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦
¦ 邏輯盤 1 (/dev/hda5) ¦<-/ ¦ ¦
¦ ¦ ¦ ¦
¦-----------------------¦ ¦ 主
¦ 擴充分區 2 ¦<----/
¦-----------------------¦ 擴
¦ 擴 展 ¦ 分區項1 ¦-- ¦ ¦------------¦ ¦ 展
¦ 分區表 ¦ 分區項 2 ¦--+-- ¦-----------------------¦ ¦ ¦ 分
¦ ¦ ¦ ¦
¦ 邏輯盤 2 (/dev/hda6) ¦<-/ ¦ 區
¦ ¦ ¦ ¦
¦-----------------------¦ ¦ ¦
¦ 擴充分區 3 ¦<----/ ¦
¦-----------------------¦ ¦
¦ 擴 展 ¦ 分區項1 ¦-- ¦
¦ ¦------------¦ ¦ ¦
¦ 分區表 ¦ 分區項 2 ¦ ¦ ¦
¦-----------------------¦ ¦ ¦
¦ ¦ ¦ ¦
¦ 邏輯盤 3 (/dev/hda7) ¦<-/ ¦
¦ ¦ ¦
¦-----------------------¦ ---------
¦ 擴 展 ¦ 分區項1 ¦-- ¦ ¦------------¦ ¦ 展
¦ 分區表 ¦ 分區項 2 ¦--+-- ¦-----------------------¦ ¦ ¦ 分
¦ ¦ ¦ ¦
¦ 邏輯盤 2 (/dev/hda6) ¦<-/ ¦ 區
¦ ¦ ¦ ¦
¦-----------------------¦ ¦ ¦
¦ 擴充分區 3 ¦<----/ ¦
¦-----------------------¦ ¦
¦ 擴 展 ¦ 分區項1 ¦-- ¦
¦ ¦------------¦ ¦ ¦
¦ 分區表 ¦ 分區項 2 ¦ ¦ ¦
¦-----------------------¦ ¦ ¦
¦ ¦ ¦ ¦
¦ 邏輯盤 3 (/dev/hda7) ¦<-/ ¦
¦ ¦ ¦
¦-----------------------¦ -------------
三、系統啟動過程主要由一下幾步組成(以硬碟啟動為例):
1. 開機 :-)
2. BIOS 加電自檢 ( Power On Self Test -- POST )
記憶體位址為 0ffff:0000
3. 將硬碟第一個扇區 (0頭0道1扇區, 也就是BootSector)
讀入記憶體位址 0000:7c00 處.
4. 檢查 (WORD) 0000:7dfe 是否等於 0xaa55,若不等於
則轉去嘗試其他啟動介質,如果沒有其他啟動介質則顯示
"No ROM BASIC" 然後死機.
5. 跳轉到 0000:7c00 處執行 MBR 中的程式.
6. MBR 首先將自己複製到 0000:0600 處,然後繼續執行.
7. 在主要磁碟分割表中搜尋標誌為活動的分區.如果發現沒有活動
分區或有不止一個使用中的磁碟分割, 則轉停止.
8. 將使用中的磁碟分割的第一個扇區讀入記憶體位址 0000:7c00處.
9. 檢查 (WORD) 0000:7dfe 是否等於 0xaa55,若不等於則
顯示 "Missing Operating System" 然後停止,或嘗試
磁碟片啟動.
10. 跳轉到 0000:7c00處繼續執行特定系統的啟動程式.
11. 啟動系統 ...
以上步驟中 2,3,4,5 步是由 BIOS 的引導程式完成.6,7,8,9,10
步由MBR中的引導程式完成.
一般多系統引導程式 (如 SmartFDISK, BootStar, PQBoot等)
都是將標準主引導記錄替換成自己的引導程式, 在運行系統啟動程式
之前讓使用者選擇要啟動的分區.
而某些系統內建的多系統引導程式 (如 lilo, NT Loader等)
則可以將自己的引導程式放在系統所處分區的第一個扇區中, 在 Linux
中即為 SuperBlock (其實 SuperBlock 是兩個扇區).
注: 以上各步驟中使用的是標準 MBR,其他多系統引導程式的引導
過程與此不同.