硬盤邏輯結構相關知識簡介
本文內容主要介紹硬盤邏輯結構方面的一些參數和概念,包括Int 13H 調用、Boot Sector 結構、分區表結構、擴展分區等知識。
1. 硬盤參數
很久以前, 硬盤的容量還非常小的時候,人們采用與軟盤類似的結構生產硬盤。 也就是硬盤盤片的每一條磁道都具有相同的扇區數。由此產生了所謂的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.擴展 Int 13H 簡介
雖然現代硬盤都已經采用了線性尋址, 但是由于基本 Int13H 的制約, 使用 BIOS Int 13H 接口的程序, 如 DOS 等還只能訪問 8 G以內的硬盤空間。為了打破這一限制, Microsoft 等幾家公司制定了擴展 Int 13H 標準(Extended Int13H), 采用線性尋址方式存取硬盤, 所以突破了 8 G的限制,而且還加入了對可拆卸介質 (如活動硬盤) 的支持。
4. 現代硬盤結構簡介
在老式硬盤中, 由于每個磁道的扇區數相等,所以外道的記錄密度要遠低于內道, 因此會浪費很多磁盤空間 (與軟盤一樣)。 為了解決這一問題,進一步提高硬盤容量, 人們改用等密度結構生產硬盤。 也就是說,外圈磁道的扇區比內圈磁道多。 采用這種結構后, 硬盤不再具有實際的3D參數,尋址方式也改為線性尋址, 即以扇區為單位進行尋址。
為了與使用3D尋址的老軟件兼容 (如使用BIOSInt13H接口的軟件), 在硬盤控制器內部安裝了一個地址翻譯器,由它負責將老式3D參數翻譯成新的線性參數。 這也是為什么現在硬盤的3D參數可以有多種選擇的原因(不同的工作模式, 對應不同的3D參數, 如 LBA, LARGE, NORMAL)。
5.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 的具體結構如下圖所示:
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 |
|---------------------------------------------|
6.分區表結構簡介
分區表由四個分區項構成, 每一項的結構如下:
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.
7. 擴展分區簡介
由于主分區表中只能分四個分區, 無法滿足需求,因此設計了一種擴展分區格式。 基本上說, 擴展分區的信息是以鏈表形式存放的,但也有一些特別的地方。首先, 主分區表中要有一個基本擴展分區項,所有擴展分區都隸屬于它,也就是說其他所有擴展分區的空間都必須包括在這個基本擴展分區中。對于DOS / Windows 來說, 擴展分區的類型為 0x05. 除基本擴展分區以外的其他所有擴展分區則以鏈表的形式級聯存放, 后一個擴展分區的數據項記錄在前一個擴展分區的分區表中,但兩個擴展分區的空間并不重疊。
擴展分區類似于一個完整的硬盤, 必須進一步分區才能使用。但每個擴展分區中只能存在一個其他分區。 此分區在 DOS/Windows環境中即為邏輯盤。因此每一個擴展分區的分區表(同樣存儲在擴展分區的第一個扇區中)中最多只能有兩個分區數據項(包括下一個擴展分區的數據項)。