🚩 核心目標

今天的目標是將內核從物理低地址搬遷到虛擬空間的高位 —— 3GB + 1MB (0xC0100000)。這是邁向現代作業系統的重要一步,它能確保內核與未來的用戶程序在虛擬地址空間中各司其職,互不干擾。


1. 為什麼要搬到 Higher Half?

將內核放在虛擬地址的高位(通常是 3GB 以上)有以下優點:


2. 邁向 1MB 的物理搬遷:A20 與 LBA 陷阱

在進入分頁之前,我們首先需要將內核加載到物理內存 1MB 的位置,以避開 BIOS 和顯存佔用的低端區域。

2.1 A20 地址線的束縛

問題描述:在 8086 時代為了兼容性,第 21 根地址線(A20)默認是關閉的。如果不開啟 A20,訪問 1MB 以上地址時會發生「回環(Wrap-around)」,重新回到 0MB。 解決方案:我們必須透過 I/O 端口(如鍵盤控制器 0x64/0x60 或 Fast A20 0x92)顯式地開啟 A20 Gate,解鎖 1MB 以上的物理訪問權限。

2.2 LBA 加載的限制

問題描述:使用 BIOS 中斷(int 0x13)加載磁碟時,CPU 仍處於實模式或特定的限制下,無法直接將數據讀入 1MB 以上的擴展內存。 解決方案:我們先將內核分批加載到低位緩衝區,再透過 rep movsd(進入保護模式後)手動將代碼搬運到物理地址 0x100000 (1MB) 位置。


3. 分頁啟動時的「影子轉換」 (The Relocation Pitfall)

這是今天最難的邏輯坑:在分頁開啟前,如何訪問高地址的變量?

3.1 虛擬地址與物理地址的錯位

當我們的編譯器將內核鏈結在 0xC0100000 時,所有的變量符號地址都是高地址。但在開啟分頁(Set PG bit in CR0)之前,CPU 只能尋址物理地址。