磁碟區開機記錄
磁碟區開機紀錄(VBR)(又稱為磁碟區開機磁區、磁碟分割開機紀錄或磁碟分割開機磁區)是由 IBM 個人電腦所引入的一種開機磁區。它可能存在於已分割的資料儲存裝置(如硬碟)或未分割的裝置(如軟碟)上,並包含用於啟動載入儲存在裝置其他部分之程式(通常是作業系統,但非必要)的機器碼。在未分割的儲存裝置上,它是裝置的第一個磁區。在已分割的裝置上,它是裝置上個別磁碟分割的第一個磁區,而整個裝置的第一個磁區則是包含磁碟分割表的主要開機紀錄(MBR)。
磁碟區開機紀錄中的程式碼可由機器的韌體直接呼叫,或由主要開機紀錄或開機管理程式中的程式碼間接呼叫。MBR 和 VBR 中的程式碼本質上是以相同的方式載入。
透過開機管理程式呼叫 VBR 的過程稱為鏈式載入。一些雙重開機系統,例如 NTLDR(微軟 Windows NT 衍生作業系統所有版本,直至並包含 Windows XP 和 Windows Server 2003 的開機載入程式),會將各個作業系統安裝到單一磁碟分割 VBR 中的啟動載入碼複製並儲存於磁碟檔案中,在開機載入程式詢問使用者要啟動哪個作業系統後,從檔案載入相關的 VBR 內容。 在 Windows Vista、Windows Server 2008 及更新版本中,NTLDR 已被取代;開機載入功能改由兩個新元件提供:WINLOAD.EXE 和 Windows 開機管理程式。
在 FAT12(DOS 1.x 除外)、FAT16、FAT32、HPFS 和 NTFS 等檔案系統中,VBR 也包含一個 BIOS 參數區塊(BPB),用以指定檔案系統主要磁碟上資料結構的位置和佈局。(關於 FAT VBR 的磁區配置、各種 FAT BPB 版本及其條目的詳細討論,可在 FAT 的相關文章中找到。)
技術細節
簽章
依照慣例,開機磁區中若存在適用於 x86 CPU 的 IBM PC 相容開機載入程式,會由一個稱為開機磁區簽章的雙位元組十六進位序列表示(在磁區大小為 512 位元組或以上時,於固定位移 `+1FEh` 處為 `55h`,`+1FFh` 處為 `AAh`)。對於 512 位元組的磁區,開機磁區簽章也標誌著磁區的結尾。在更小或更大磁區上的 VBR 也可能在其實際磁區大小的末端顯示簽章,然而,此處描述的語意僅適用於 `+1FEh` 處的 16 位元簽章。
此簽章表示至少存在一個可安全執行的虛設開機載入程式,即使它可能無法實際載入作業系統。它並不表示存在某個(或甚至特定的)檔案系統或作業系統,儘管某些 3.3 版之前的舊版 DOS 在其偵測 FAT 格式化媒體的過程中依賴此簽章(較新版本則不然)。其他平台或 CPU 的開機程式碼不應使用此簽章,因為當 BIOS 假設開機磁區包含有效的可執行碼而將執行權交給它時,可能會導致當機。這意味著,要讓非常舊版的 DOS 也能使用的 FAT12/FAT16 媒體必須保留此簽章,即使它們不包含作業系統或僅用於在其他平台上開機;因此,它們也必須至少包含一個 x86 相容的(虛設)載入程式(可比較 Atari ST 上的 FAT 和 MSX-DOS 的範例)。儘管如此,一些用於其他平台的媒體即使沒有 x86 相容的虛設載入程式,也錯誤地包含了此簽章,使得這項檢查在實務上並非 100% 可靠。
自(至少)IBM PC/AT 以來的大多數系統 BIOS 都會測試此簽章(但最初的 IBM PC 和其他一些機器則不會)。不僅如此,大多數 MBR 開機載入程式在將控制權交給開機磁區之前也會檢查它。某些 BIOS(如 IBM PC/AT)只對固定磁碟/可卸除式磁碟機執行此檢查,而對於軟碟和超級軟碟,只要起始位元組大於或等於 `B0h` 且前九個字不包含相同的值,開機磁區就會被視為有效,從而避免對軟碟進行 `55h`、`AAh` 的明確測試。由於舊的開機磁區(即非常古老的 CP/M-86 和 DOS 媒體)有時即使可以成功開機也沒有此簽章,因此在某些環境下可以禁用此檢查。這也反映了軟碟可以被格式化為使用小於 512 位元組的磁區大小。
如果 BIOS 或 MBR 程式碼未偵測到有效的開機磁區,因此無法將執行權交給開機磁區程式碼,它將嘗試序列中的下一個開機裝置。如果所有裝置都失敗,它通常會顯示一則錯誤訊息並呼叫 INT 18h。這將會啟動 ROM 中的可選常駐軟體(ROM BASIC)、嘗試透過網路遠端開機、在使用者確認後透過 INT 19h 重新啟動系統,或導致系統中止啟動載入過程,直到下次開機。
從十進位位移 72 到 79,一個 NTFS PBR 包含磁碟分割 UUID 磁碟區 ID 序號。
呼叫
VBR 中的開機程式碼可以假設 BIOS 已經設定好其資料結構和中斷,並已初始化硬體。為求容錯操作,程式碼不應假設存在超過 32 KB 的記憶體;如果需要更多記憶體,應為此查詢 INT 12h,因為其他開機前程式碼(例如 BIOS 擴充功能覆蓋層、加密系統或遠端啟動載入程式)也可能存在於記憶體的其他地方(並且通常會透過相應減少回報的 INT 12h 記憶體大小來隱藏自己,以免被 MBR 和 VBR 的操作覆寫)。BIOS 開機規範允許 64 KB 的記憶體,並明確建議將 `0000h:8000h` 至 `0000h:FFFFh` 作為 MBR 和/或 VBR 的記憶體空間。開機程式碼不得假設 CPU 優於原始的 Intel 8088 或 8086(用於原始 PC),且不得對硬體的確切狀態、中斷系統(中斷可為啟用或停用狀態)或堆疊的位置和大小做任何假設。儘管原始 IBM BIOS 將 DS、ES 和 SS CPU 暫存器初始化為區段 `0000h` 並將初始堆疊維持在 SS:SP = `0000h:0400h`,但這並非一個可依賴的條件,因為並非所有 BIOS 和 MBR 程式碼都遵循此慣例。下方未提及的暫存器必須視為未初始化。通常不允許直接存取硬體。雖然磁碟參數表(DPT/FDPB)通常已在記憶體的 `0000h:0078h` 處設定好,但 VBR 必須將 INT 1Eh 向量所指向的 DPT 移動(並可能修復)至此位置(INT 1Eh 不是中斷,而是指向 DPT 的遠指標)。
在受控環境中,某些條件可以放寬,例如,現今一些開機載入程式在正常操作中會假設有高達 128 KB 的記憶體可供使用(無需查詢更多),而一些使用 LBA 存取的開機載入程式則假設至少有 Intel 80188 或 80186 CPU。
當先前的啟動載入程式(通常是 BIOS 或 MBR,但可能為另一開機載入程式)透過跳轉至 CPU 真實模式下的 `0000h`:`7C00h` 將執行權交給 VBR 時,VBR 會被載入到記憶體位址 `0000h`:`7C00h`,且 CPU 暫存器設定如下。
- CS:IP = `0000h`:`7C00h` (固定)
某些 Compaq BIOS 錯誤地使用 `07C0h`:`0000h`。雖然這在真實模式記憶體中解析為相同的位置,但這是不標準的,應予以避免,因為假設特定暫存器值或未編寫為可重定位的 VBR 程式碼可能因此無法運作。
- DL = 開機磁碟機單元(軟碟/超級軟碟:`00h` = 第一個,`01h` = 第二個,...,`7Eh`;固定磁碟/可卸除式磁碟機:`80h` = 第一個,`81h` = 第二個,...,`FEh`;值 `7Fh` 和 `FFh` 保留給 ROM/遠端磁碟機,不得在磁碟上使用)。DL 受 IBM BIOS 及大多數其他 BIOS 支援。已知 Toshiba T1000 BIOS 不正確支援此功能,且某些舊的 Wyse 286 BIOS 對硬碟使用大於或等於 2 的 DL 值。被設定為超級軟碟的 USB 隨身碟通常會被分配 DL = `00h` 或 `01h`,然而,一些罕見的 BIOS 也錯誤地將設定為可卸除式磁碟機的 USB 隨身碟呈現為 DL = `01h`,而非使用 DL = `80h`。傳統上,BIOS 在開機期間只傳遞 `00h` 和 `80h` 這兩個值,且許多開機磁區無論如何都硬性編碼為使用固定值。隨插即用 BIOS 規範和 BIOS 開機規範(BBS)也允許其他裝置變得可開機。後者也建議 MBR 和 VBR 程式碼應使用 DL 而非內部硬性編碼的預設值。(注意:MS-DOS/PC DOS 和 OS/2 的 VBR 會忽略提供的 DL 值,而改為擷取儲存在延伸 BIOS 參數區塊(EBPB)位移 `+19h` 處或 DOS 3.2 至 3.31 版中磁區位移 `+1FDh` 處的值。某些版本的 DR-DOS 從 7.02 開始使用 DL。DR-DOS 7.07 的 VBR 預設使用 DL 並忽略 BPB 值,但可使用 `SYS /O[:nnn]` 重新啟用使用 BPB 值的舊行為,甚至強制將特定的開機磁碟機單元 `nnn` 儲存在那裡。在 FAT32 磁碟區上,FreeDOS 也利用 DL 值,而在 FAT12/FAT16 磁碟區上,僅當 BPB 值設為 `FFh` 時才如此。)
- DH 位元 5 = 0:裝置透過 INT 13h 支援;否則:不理會(應為零)。DH 受某些 IBM BIOS 支援。某些 MBR 和 VBR 程式碼會保留 DH 的值。
具備隨插即用 BIOS 或 BBS 支援的系統,除了 DL 之外,還會提供一個指向 PnP 資料的指標:
- DL = 開機磁碟機單元(見上文)
- ES:DI = 指向 "``$PnP``" 安裝檢查結構
此資訊允許開機載入程式(在 MBR 或 VBR 中)主動與 BIOS 或記憶體中常駐的 PnP / BBS 覆蓋層互動,以設定開機順序等,然而,此資訊被大多數標準的 MBR 和 VBR 忽略。理想情況下,ES:DI 會被傳遞,但支援 PnP 的作業系統通常也有備援方法來稍後擷取 PnP BIOS 進入點,因此大多數作業系統並不依賴此項。ES:DI 中的資訊可作為提示——根據 PnP BIOS 規範,「$PnP」安裝檢查結構可透過在系統記憶體中從 F0000h 到 FFFFFh 每 16 位元組邊界搜尋 ASCII 字串 $PnP 的簽章來找到。
對於已分割的媒體,當 VBR 由 MBR(或其他開機載入程式)而非 BIOS 啟動時,許多實作除了 DL(有時也包括 DH 和 ES:DI)外,還會傳遞額外資訊給 VBR:
- DS:SI = 指向對應於已啟動 VBR 的 16 位元組 MBR 磁碟分割表項目(在重定位的 MBR 中)。如果磁碟分割表中沒有任何磁碟分割被標記為可開機,PC-MOS 5.1 依賴此項來開機。結合 LOADER,Multiuser DOS 和 REAL/32 的開機磁區在找不到開機檔案(LOADER.SYS)時,會用此來定位作用中磁碟分割的開機磁區(或磁碟上固定位置的另一個啟動載入程式,如 IBMBIO.LDR)。PTS-DOS 6.5 和 S/DOS 1.0 結合其進階作用中磁碟分割(AAP)功能使用此項。除了支援 LOADER 和 AAP,DR-DOS 7.07 在使用其雙重 CHS/LBA VBR 程式碼時,可利用此項來決定必要的 INT 13h 存取方法。OS/2、MS-DOS(7.0 之前)、PC DOS(至 7.10)和 Windows NT(至約 2007 年)的 MBR 程式碼恰好也提供相同的介面,儘管這些系統並未使用它。Windows NT 6.0(及更高版本)安裝的 MBR 使用其他暫存器,因此不再與這些擴充功能相容。雖然某些擴充功能僅依賴於 16 位元組的磁碟分割表項目本身,但其他擴充功能可能需要整個 4(或 5 個項目)的磁碟分割表也存在。
在 DR-DOS 7.07 下,MBR 可選擇性地使用一個擴充介面並與 LOADER 結合:
- AX = 魔術簽章,表示此擴充功能的存在(`0EDCh`)
- DL = 開機磁碟機單元(見上文)
- DS:SI = 指向所使用的 16 位元組 MBR 磁碟分割表項目(見上文)
- ES:BX = 開機磁區或特殊 "``NEWLDR``" 磁區映像的起始位置(通常為 `7C00h`)
- CX = 保留
結合 GUID 磁碟分割表(GPT),一份增強型磁碟機規格(EDD)4 混合式 MBR 提案建議對 MBR 至 VBR 介面進行另一項擴充:
- EAX = `54504721h` ("`!GPT`")
- DL = 開機磁碟機單元(見上文)
- ES:DI = 指向 "``$PnP``" 安裝檢查結構(見上文)
- DS:SI = 指向一個混合式 MBR 遞交結構,該結構由一個 16 位元組的虛設 MBR 磁碟分割表項目(除了位移 `+0h` 的開機旗標和位移 `+4h` 的磁碟分割類型外,所有位元均設為 1)以及額外資料組成。如果那些較舊的擴充功能只需要 16 位元組的磁碟分割項目而非整個磁碟分割表,這部分相容於上述較舊的 DS:SI 擴充功能。
參見
- 主要開機紀錄 (MBR)
- 延伸開機紀錄 (EBR)
- BIOS 參數區塊 (BPB)
- FAT 檔案系統中的 BPB 格式
- 磁碟分割
- 磁碟分割對齊
註解
參考資料
延伸閱讀
Category:電腦檔案系統 Category:BIOS Category:開機