首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

擴展 Int 13H 調用規範詳解:突破 8GB 限制的 LBA 磁盤訪問標準

     編輯:組合語言

背景:為什麼需要擴展 Int 13H?

傳統 BIOS INT 13h 使用 CHS(柱面/磁頭/扇區)三維尋址,最大支持 1024 柱面 × 255 磁頭 × 63 扇區 × 512 字節 ≈ 8.4 GB。隨著硬盤容量突破 8GB,且現代硬盤內部已採用 LBA(邏輯塊地址)線性尋址,必須擴展 BIOS 接口以支持 64 位 LBA 地址,並增加可移動介質鎖定/彈出等功能。Microsoft 等廠商制定了 Extended Int 13h (v1.x) 規範。

核心數據結構

1. 磁盤地址包 (DAP, Disk Address Packet)

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。注意控制器內部可能有交織因子,實際物理順序不一定連續。

2. 驅動器參數包 (Drive Parameters Packet)

struct DriveParametersPacket {
  WORD  InfoSize;           // 26 字節
  WORD  Flags;              // 信息標志位
  DWORD Cylinders;          // 柱面數
  DWORD Heads;              // 磁頭數
  DWORD SectorsPerTrack;    // 每磁道扇區數
  QWORD Sectors;            // 總扇區數 (64位)
  WORD  SectorSize;         // 扇區大小 (通常 512)
};

Flags 位定義:

  • Bit 0: 1=DMA 邊界錯誤透明處理
  • Bit 1: 1=CHS 幾何信息有效
  • Bit 2: 1=可移動驅動器
  • Bit 3: 支持寫入驗證
  • Bit 4: 1=有介質更換檢測線
  • Bit 5: 1=可鎖定 (驅動器號 ≥ 0x80 的可移動設備必須置 1)
  • Bit 6: 0=返回當前介質 CHS / 1=返回驅動器最大 CHS (無介質時)
  • Bit 7-15: 保留

寄存器約定與錯誤碼擴展

  • DL = 驅動器號(0x80-0xFF 含固定盤及新型可移動設備)
  • DS:SI → DAP
  • AH = 功能號 / 返回碼
  • CF=0 成功,CF=1 失敗 (AH 為錯誤碼)

新增錯誤碼:B0h 未鎖定、B1h 已鎖定、B2h 介質可移動、B3h 介質忙、B4h 鎖定計數溢出、B5h 彈出請求失敗。

API 子集與功能詳解

子集 1:大硬盤訪問核心 (必須)

功能AH說明
檢查擴展是否存在41h入口: BX=55AAh, DL=驅動器號。返回: CF=0, BX=AA55h, CX=子集位圖 (bit0=子集1, bit1=子集2), AH=主版本號(1.x為1)
擴展讀扇區42hDS:SI→DAP。錯誤時 DAP.BlockCount 返回已讀扇區數
擴展寫扇區43hAL bit0=1 開啟寫驗證。需功能 48h 確認支持
校驗扇區44h不讀入內存,僅校驗
擴展定位47h移動磁頭到指定 LBA
獲取驅動器參數48hDS:DI→DriveParametersPacket 緩衝區

子集 2:可移動介質控制 (可選)

功能AH說明
鎖定/解鎖/查詢狀態45hAL=0 鎖定, 1 解鎖, 2 查詢。最大鎖定計數 255。無介質時鎖定合法
彈出介質46h需先鎖定。固定盤返回 B2h。內部調用 INT 15h/52h 檢查彈出可行性
獲取介質更換狀態49hCF=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)。擴展分區以鏈表形式級聯,每項最多包含一個邏輯分區與下一擴展分區指針。

實戰意義

  • DOS 系統、引導加載器、磁盤工具需調用擴展 Int 13h 訪問 >8GB 磁盤。
  • 現代 UEFI 系統已不依賴 INT 13h,但虛擬機、嵌入式、舊系統維護仍需理解此規範。
  • 編寫引導扇區、分區工具、磁盤克隆軟件時,正確處理 DAP 緩衝區地址 (實模式段:偏移) 與 64 位 LBA 運算是關鍵。

總結

擴展 Int 13h 通過引入 64 位 LBA 磁盤地址包 (DAP) 徹底解決了 8GB 容量牆,並標準化了可移動介質的鎖定/彈出控制。其設計體現了「向後兼容、最小擴展、數據結構版本化」的系統接口演進哲學。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved