傳統 BIOS INT 13h 使用 CHS(柱面/磁頭/扇區)三維尋址,最大支持 1024 柱面 × 255 磁頭 × 63 扇區 × 512 字節 ≈ 8.4 GB。隨著硬盤容量突破 8GB,且現代硬盤內部已採用 LBA(邏輯塊地址)線性尋址,必須擴展 BIOS 接口以支持 64 位 LBA 地址,並增加可移動介質鎖定/彈出等功能。Microsoft 等廠商制定了 Extended Int 13h (v1.x) 規範。
struct DiskAddressPacket {
BYTE PacketSize; // 必須為 16 (0x10)
BYTE Reserved; // 0
WORD BlockCount; // 輸入:請求傳輸扇區數 / 輸出:實際傳輸扇區數
DWORD BufferAddr; // 傳輸緩衝區地址 (Segment:Offset),必須在 1MB 實模式地址空間內
QWORD BlockNum; // 起始絕對扇區號 (LBA),0-based
};
LBA 與 CHS 換算:LBA = (Cylinder × Heads + Head) × SectorsPerTrack + Sector - 1。注意控制器內部可能有交織因子,實際物理順序不一定連續。
struct DriveParametersPacket {
WORD InfoSize; // 26 字節
WORD Flags; // 信息標志位
DWORD Cylinders; // 柱面數
DWORD Heads; // 磁頭數
DWORD SectorsPerTrack; // 每磁道扇區數
QWORD Sectors; // 總扇區數 (64位)
WORD SectorSize; // 扇區大小 (通常 512)
};
Flags 位定義:
DL = 驅動器號(0x80-0xFF 含固定盤及新型可移動設備)DS:SI → DAPAH = 功能號 / 返回碼CF=0 成功,CF=1 失敗 (AH 為錯誤碼)新增錯誤碼:B0h 未鎖定、B1h 已鎖定、B2h 介質可移動、B3h 介質忙、B4h 鎖定計數溢出、B5h 彈出請求失敗。
| 功能 | AH | 說明 |
|---|---|---|
| 檢查擴展是否存在 | 41h | 入口: BX=55AAh, DL=驅動器號。返回: CF=0, BX=AA55h, CX=子集位圖 (bit0=子集1, bit1=子集2), AH=主版本號(1.x為1) |
| 擴展讀扇區 | 42h | DS:SI→DAP。錯誤時 DAP.BlockCount 返回已讀扇區數 |
| 擴展寫扇區 | 43h | AL bit0=1 開啟寫驗證。需功能 48h 確認支持 |
| 校驗扇區 | 44h | 不讀入內存,僅校驗 |
| 擴展定位 | 47h | 移動磁頭到指定 LBA |
| 獲取驅動器參數 | 48h | DS:DI→DriveParametersPacket 緩衝區 |
| 功能 | AH | 說明 |
|---|---|---|
| 鎖定/解鎖/查詢狀態 | 45h | AL=0 鎖定, 1 解鎖, 2 查詢。最大鎖定計數 255。無介質時鎖定合法 |
| 彈出介質 | 46h | 需先鎖定。固定盤返回 B2h。內部調用 INT 15h/52h 檢查彈出可行性 |
| 獲取介質更換狀態 | 49h | CF=0 AH=0 未換, CF=1 AH=06h 可能已換。鎖定/解鎖可激活檢測線 |
| INT 15h 彈出支持 | 52h | 由 AH=46h 內部調用。CF=0 可彈出, CF=1 B1h/B3h 拒絕 |
MBR (第 0 扇區) 結構:
0000h-01BDh (446B) : 主引導代碼01BEh-01FDh (64B) : 分區表 (4 項 × 16B)01FEh-01FFh : 0xAA55 簽名分區項 16 字節:State(1) | StartCHS(3) | Type(1) | EndCHS(3) | RelativeSectors(4) | TotalSectors(4)。擴展分區以鏈表形式級聯,每項最多包含一個邏輯分區與下一擴展分區指針。
擴展 Int 13h 通過引入 64 位 LBA 磁盤地址包 (DAP) 徹底解決了 8GB 容量牆,並標準化了可移動介質的鎖定/彈出控制。其設計體現了「向後兼容、最小擴展、數據結構版本化」的系統接口演進哲學。