Linux 虛擬記憶體架構核心觀念:空間劃分、分頁機制、位址映射。
Q1:為什麼將進程位址空間劃分為「核心空間」與「用戶空間」?
A:
- 32 位元系統虛擬位址空間 4GB (0x00000000 ~ 0xFFFFFFFF)。
- 核心空間:高 1GB (0xC0000000 ~ 0xFFFFFFFF),全體進程共享,核心程式碼、資料結構、頁表駐留此處。
- 用戶空間:低 3GB (0x00000000 ~ 0xBFFFFFFF),各進程獨立,互不干擾。
- 進程透過系統呼叫 從用戶空間陷入核心空間執行特權操作。
- x86_64 擴展至 128TB 用戶空間 + 128TB 核心空間 (標準實作 48-bit)。
Q2:Linux 如何實現「請求分頁」?
A:
- 進程存取的虛擬頁若不在實體記憶體 (Page Table Entry 無效位),觸發缺頁中斷 (#PF)。
- 核心分配一個實體頁框,視情況初始化 (零頁、從磁碟讀入、Copy-on-Write)。
- 更新頁表對應,重新執行故障指令。
- 此技術將實體頁框分配推遲至真正被存取時,節省記憶體、加速啟動、支援大於實體記憶體的虛擬空間。
補充:關鍵資料結構
struct mm_struct:描述進程虛擬位址空間 (VMA 列表、頁表指標)。
struct vm_area_struct:單一虛擬記憶體區域 (起始/結束位址、權限、對應檔案)。
struct page:描述單一實體頁框狀態 (引用計數、flags、對應 address_space)。
pgd_t, p4d_t, pud_t, pmd_t, pte_t:多級頁表層級類型。
x86 三級 vs x86_64 四級頁表
- x86 (PAE):PGD → PMD → PTE (三級)。
- x86_64:P4D → PUD → PMD → PTE (四級),支援 256TB 虛擬空間。
理解空間劃分與請求分頁,是深入核心記憶體管理、驅動開發與效能調校的基石。