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

自製多重引導載入器:修改 MBR 分區表實現多系統啟動

     編輯:組合語言

當需要在已安裝 Windows 2000/XP 的電腦上再安裝 Windows 98/DOS 等舊版系統時,原有的 NTLDR 無法識別較舊的系統。第三方工具(BootMagic, System Commander)透過將硬碟分割為多個主分區(多「C」盤),修改 MBR 分區表的啟動標誌位實現多重引導。本文深入剖析其核心原理,並提供完整的組合語言實作程式碼。

硬碟佈局與 MBR 結構

區域大小說明
主引導扇區 (MBR)1 扇區 (512 位元組)偏移 00H-1BDH: MBR 程式碼 (446 bytes)
偏移 1BEH-1FDH: 分區表 (64 bytes, 4 項 × 16 bytes)
偏移 1FEH-1FFH: 結束標誌 55AAh
主分區引導扇區1 扇區各主分區第一扇區
FAT/根目錄/資料區依分區大小檔案系統資料
擴展分區表/邏輯分區鏈結結構超過 4 分區時使用

分區表項目結構 (16 bytes)

偏移大小含義
00H1 byte啟動標誌:80h=可啟動, 00h=不可啟動
01H1 byte起始磁頭號
02H1 byte高 2 位=起始柱面高位, 低 6 位=起始扇區號
03H1 byte起始柱面低位
04H1 byte系統標誌:04h=FAT16, 0Bh=FAT32, 07h=NTFS, 83h=Linux, 05h/0Fh=擴展分區
05H-07H3 bytes結束磁頭/柱面/扇區 (同起始格式)
08H-0BH4 bytesLBA 起始扇區號
0CH-0FH4 bytes總扇區數

多重引導核心原理

只需修改分區表項目偏移 00H 的啟動標誌位:將欲啟動分區的標誌設為 80h,其餘設為 00h。BIOS 讀取 MBR 後,會將控制權移交給標誌為 80h 的分區引導扇區。

雙模組架構設計

模組一:新 MBR 程式 (SYSGUIDE.DAT,寫入 0 磁道 0 柱面 1 扇區)

  • 開機時 BIOS 載入並執行 (0000:7C00)
  • 自我搬移至 0000:0600 避免被後續載入覆蓋
  • 顯示選單:讀取分區表,列出 4 個主分區供選擇
  • 讀取使用者按鍵 (1-4)
  • 驗證對應分區系統標誌非 00h/05h/0Fh (非空、非擴展)
  • 修改記憶體中分區表:選中項標誌=80h,其餘=00h
  • 將修改後的分區表寫回 MBR (0,0,1) 及備份扇區 (0,0,6)
  • 跳轉至原 MBR 代碼 (0000:7C00) 繼續啟動流程

模組二:安裝/解除安裝程式 (SYSGUIDE.EXE,DOS/Windows 下執行)

  • 選單:(1) 安裝 (2) 解除安裝
  • 安裝:讀取 MBR (0,0,1) → 檢查是否已安裝 (檢查特徵字串 "choose") → 否則備份原 MBR 至 (0,0,6) → 讀取 SYSGUIDE.DAT 寫入 MBR
  • 解除安裝:讀取 MBR → 驗證特徵字串 → 從備份 (0,0,6) 恢復 MBR

關鍵程式碼片段 (模組一 核心邏輯)

; 讀取分區表至 0000:1000h
mov ax,0201h; mov cx,0001h; mov dx,0080h; mov bx,1000h; int 13h
; 讀取原 MBR 備份至 0000:7C00h
mov ax,0201h; mov cx,0006h; mov dx,0080h; mov bx,7c00h; int 13h

readkey:
  mov ah,00h; int 16h
  cmp al,'1'; je number1
  cmp al,'2'; je number2
  cmp al,'3'; je number3
  cmp al,'4'; je number4
  jmp readkey

number1:  ; 選擇分區 1
  mov al,[11c2h]        ; 讀取分區 1 系統標誌 (偏移 1BEh+4)
  cmp al,00h; je error1
  cmp al,05h; je error1
  cmp al,0fh; je error1
  mov ah,80h
  mov [11beh],ah        ; 分區 1 標誌=80h
  mov [11ceh],00h       ; 分區 2 標誌=00h
  mov [11deh],00h       ; 分區 3 標誌=00h
  mov [11eeh],00h       ; 分區 4 標誌=00h
  jmp ok
; number2/3/4 類似,修改對應偏移

ok:
  ; 寫回修改後的分區表到 MBR (0,0,1) 和備份 (0,0,6)
  mov ax,0301h; mov cx,0001h; mov dx,0080h; mov bx,1000h; int 13h
  mov cx,0040h; mov di,7dbeh; mov si,11beh; repnz movsw  ; 複製分區表到備份區
  mov ax,0301h; mov cx,0006h; mov dx,0080h; mov bx,7c00h; int 13h
  ; 跳轉執行原 MBR
  mov bx,7c00h; jmp bx

編譯與部署步驟

  1. 模組一源碼用 TASM/MASM 編譯連結成 GUIDE.EXE (切勿直接執行)
  2. 用 DEBUG 提取前 445 位元組 (1BDh) 為 SYSGUIDE.DAT:
    DEBUG GUIDE.EXE
    -R CX
    -1BD
    -N SYSGUIDE.DAT
    -W
    -Q
        
  3. 模組二編譯為 SYSGUIDE.EXE
  4. 將 SYSGUIDE.DAT 和 SYSGUIDE.EXE 放同目錄
  5. 在目標系統 (如新裝的 Win98) 執行 SYSGUIDE.EXE 選 1 安裝
  6. 重開機即見選單,選擇分區啟動對應系統

擴展:自動識別作業系統 (BootMagic 風格)

分區表項目偏移 04H 的系統標誌位 (04h/0Bh/07h/83h...) 即可識別檔案系統類型。讀取此位元組,配合分區大小、位置,即可在選單顯示「Windows XP (NTFS)」、「Windows 98 (FAT32)」、「Linux (Ext2)」等友善名稱,而非單調的「分區 1/2/3/4」。

安全性提醒

  • 修改 MBR 屬高風險操作,錯誤可能導致資料無法存取
  • 實作前務必備份重要資料
  • 程式碼僅供教學研究,生產環境建議使用成熟工具 (BootMagic, GRUB, systemd-boot 等)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved