Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 記憶體尋址:物理/虛擬/線性地址轉換與多級頁表架構

編輯:Linux 教學

理解 Linux 記憶體尋址需區分三種地址空間,掌握 MMU(記憶體管理單元)的分段+分頁兩級轉換流程,以及為何現代核心採用四級頁表支援 64 位架構。

三種地址的定義與關係

地址類型定義範圍(32位)備註
物理地址記憶體總線上的真實地址,直接驅動 DRAM 選列/行0 ~ 4GB-1由硬體決定,核心通過 __pa()/__va() 轉換
虛擬地址進程看到的地址,格式「段選擇子:偏移量」0 ~ 4GB-1用戶態指針、函數參數均為虛擬地址
線性地址分段轉換後的中間地址,平坦、連續、無段界限0 ~ 4GB-1Linux 將所有段基址設 0,限長 4GB,虛擬≈線性

保護模式下 MMU 雙階段轉換

  1. 分段機制:段選擇子 → GDT/LDT 查段描述符 → 基址 + 偏移量 = 線性地址。Linux 實現「平坦模型」,所有段基址=0,限長=4GB,虛擬地址實際等於線性地址,簡化管理。
  2. 分頁機制:線性地址 → 頁目錄/頁表查找 → 物理頁框號 + 頁內偏移 = 物理地址。核心控制 CR3 指向當前進程 PGD,上下文切換時更新 CR3。

為何需要多級頁表?

32 位 4GB 空間若用單級頁表:1M 頁 × 4 字節 = 4MB 連續內存,分配困難且浪費(稀疏地址空間)。兩級頁表將頁表再分頁:PGD(1K 項)指向 PTE 頁表(每 1K 項映射 4MB),僅為已映射區域分配 PTE 頁,極大節省內核內存。

64 位架構的四級頁表

x86_64/ARM64 採用 48 位虛擬地址(256TB),四級結構:

PGD (Page Global Directory)   512 項, 每項覆蓋 512GB
PUD (Page Upper Directory)    512 項, 每項覆蓋 1GB
PMD (Page Middle Directory)   512 項, 每項覆蓋 2MB (大頁) 或指向 PTE
PTE (Page Table Entry)        512 項, 每項映射 4KB 頁框

Linux 定義 pgd_t、pud_t、pmd_t、pte_t 統一類型,通過 pgd_offset()→pud_offset()→pmd_offset()→pte_offset_map() 遍歷。支援 大頁(HugeTLB,2MB/1GB) 直接由 PMD/PUD 映射,減少 TLB 缺失、提升數據庫/高性能計算場景性能。

TLB 與頁面高速緩存

CPU 內建 TLB(Translation Lookaside Buffer)快取近期頁表項。x86 典型 64 項 L1 TLB + 512 項 L2 TLB,覆蓋 128KB~2MB 內存。核心提供 flush_tlb_all()、flush_tlb_page()、invlpg 指令管理 TLB 一致性。PGE(全局頁標誌)防止內核映射被用戶態切換刷新。

Copyright © Windows教程網 All Rights Reserved