一、分頁機制核心原理
1.1 分頁技術原理
核心思想:
將虛擬地址空間和物理內存劃分為固定大小的頁(Page),通過頁表(Page Table)建立虛擬頁到物理頁框(Page Frame)的映射。例如,x86_64架構的4級頁表結構:
虛擬地址: [63-48] | [47-39] PGD | [38-30] PUD | [29-21] PMD | [20-12] PTE | [11-0] 頁內偏移保留位 全局目錄 上層目錄 中間目錄 頁表項
關鍵流程:
- CPU通過CR3寄存器定位頁全局目錄(PGD)
- 逐級查詢頁表項(PGD→PUD→PMD→PTE)
- 最終物理地址 = 物理頁框號 << 12 + 頁內偏移
?? 面試題1:分頁和分段的主要區別是什么?
答案要點:
- 劃分粒度:分頁是固定大小(4KB),分段是邏輯單元(代碼/數據段)
- 碎片問題:分頁只有內部碎片,分段有外部碎片
- 地址空間:分頁提供線性虛擬地址,分段是二維地址(段基址+偏移)
- 應用場景:分頁是現代OS標準,分段用于嵌入式或特殊場景
1.2 多級頁表設計
設計動機:
直接映射所有虛擬地址需要巨大頁表(48位地址需256TB頁表)。多級頁表通過稀疏存儲節省空間,僅分配實際使用的頁表項。
Linux四級頁表示例:
// 內核源碼示例(arch/x86/include/asm/pgtable.h)
#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address))
#define p4d_offset(pgd, address) (p4d_val(*(pgd)) & _PAGE_PRESENT ? p4d_offset_pgd(pgd, address) : NULL)
// ... 類似定義pud_offset/pmd_offset/pte_offset
?? 面試題2:為什么使用多級頁表?計算48位地址空間單級頁表的內存占用?
答案要點:
- 空間優化:單級頁表需要 (2^{48} / 2^{12} \times 8B = 256TB)(不可行)
- 實際占用:四級頁表僅分配進程實際使用的內存區域
- 計算示例:
若進程使用1GB內存,四級頁表總大小 ≈ (1GB/2MB \times 4 \times 8B = 16KB)
二、分頁技術的核心優勢
2.1 內存保護與隔離
頁表項權限位:
// 頁表項標志位(arch/x86/include/asm/pgtable_types.h)
#define _PAGE_PRESENT BIT(0) // 頁是否在物理內存
#define _PAGE_RW BIT(1) // 可寫權限
#define _PAGE_USER BIT(2) // 用戶態可訪問
#define _PAGE_PWT BIT(3) // Write-Through緩存策略
#define _PAGE_NX