iT邦幫忙

2025 iThome 鐵人賽

DAY 25
0
自我挑戰組

30 天 hypervisor 入門系列 第 25

Day 25 在 QEMU 上把 GRUB 跑起來

  • 分享至 

  • xImage
  •  

之前已打通 BIOS 端的 A20 與 E820,也實作了文字輸出(INT 10h,0xB8000 → SDL2);硬碟通路具備 INT 13h 與 ATA PIO。到這個節點,先暫緩擴充 BIOS 細節,改以 GRUB 作為前段引導器,使用 ISO 作為唯一啟動媒介,先在 QEMU 裡把鏈條跑通,再導入我們的系統,藉此降低整體實作複雜度。

導入 GRUB

首先我們會把媒介讀檔與交棒後的邏輯分離,前者交給 GRUB,後者由我們的系統處理。如此一來,驗證只聚焦在兩點,映像檔是否正確、GRUB 設定是否能準確交棒。
同時我們會以 QEMU 來做驗證。QEMU 提供穩定、可重現的 BIOS 啟動路徑,韌體行為與裝置模型都是固定,因此我們可只專注在檢查:

  • 映像內容是否正確。
  • GRUB 設定是否合理。
  • 交棒後的程式是否能活過來。

啟動媒介 ISO

啟動媒介選用 ISO。GRUB 以自己的檔案系統與驅動完成讀檔,先不依賴尚未實作的 INT 13h 擴充(EDD/LBA48)。也就是把「從媒介把檔案搬進記憶體」這個容易出錯的環節外包,避免同時在 I/O 與高階啟動邏輯兩邊炸裂。若導入失敗,可在 GRUB 命令列就地檢查路徑與載入順序;若成功,代表後段程式邏輯可疑值,直接在 HV 直接跑同一張 ISO 即可。

ISO 佈局

ISO 的佈局刻意保持簡單,並對齊 GRUB 的尋徑習慣:

  • /boot/grub/:放 grub.cfg。
  • /boot/:放載入目標 boot.bin。
    GRUB 開機後會到 /boot/grub/ 讀取 grub.cfg,依指示執行 chainloader /boot/boot.bin。
    chainload boot.bin 的意思是把 boot.bin 把它當成一段可直接引導的 real mode 程式看待,他會把 boot.bin 載入傳統的引導位置 (0x7C00) 在將控制權轉交給它。此時 CPU 保持在實模式,後續段暫存器、堆疊、A20 等環境一樣由 boot.bin 自行處理。

GRUB 啟動

https://ithelp.ithome.com.tw/upload/images/20251009/20178814dRTjkjvGeZ.png


上一篇
Day 24 INT 15h, AX=e820h
系列文
30 天 hypervisor 入門25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言