iT邦幫忙

2026 iThome 鐵人賽

DAY 4
0
自我挑戰組

從 Page Fault 到 OOM:Linux 記憶體管理 30 天拆解系列 第 4

Page table:位址轉換到底怎麼做

  • 分享至 

  • xImage
  •  

VMA 告訴 kernel 某段虛擬位址應該怎麼處理,但 CPU 每次讀寫記憶體時,需要的是更具體的答案:這個虛擬位址到底對應到哪個實體頁面?這就是 page table 的工作。它負責把虛擬位址翻譯成實體位址,也順便記錄權限和一些狀態。

現代系統通常不會以 byte 為單位做映射,而是以 page 為單位。常見 page 大小是 4 KiB。也就是說,虛擬位址空間會被切成很多虛擬頁面,實體記憶體也會被切成很多 page frame。page table 記錄某個虛擬頁面目前對應到哪個 page frame。

如果每個虛擬頁面都用一筆表格直接記錄,表格會非常大。所以 x86-64 和其他架構通常使用多層 page table。虛擬位址會被拆成幾段,每一段用來索引不同層級的表格,最後找到 page table entry。這個 entry 會指出實體頁面的 frame number,也會帶著 present、writable、user、dirty、accessed 等 bit。

這些 bit 很關鍵。present bit 表示這個映射目前是否有效。writable bit 控制是否能寫入。user bit 決定 userspace 能不能碰。dirty bit 和 accessed bit 則能協助 kernel 判斷頁面是否被寫過、是否最近被使用過,後面做 reclaim 時會派上用場。

如果 process 存取一個虛擬位址,但 page table 顯示它目前沒有有效映射,CPU 就會觸發 page fault。page fault 不一定是錯誤,它只是 CPU 告訴 kernel:「這個位址現在翻譯不出來,請你決定怎麼處理。」kernel 會回頭查 VMA,看這個位址是否合理。如果合理,就可能配置頁面或從檔案載入;如果不合理,就會送出 SIGSEGV

page table 也讓多個 process 可以共享同一個實體頁面。例如 shared library 的唯讀程式碼頁面,可以被很多 process 的 page table 指到同一批 page frame。這也是為什麼單看每個 process 的 RSS,可能會高估整台機器實際被獨占的記憶體。

下一篇會看 TLB。page table 很彈性,但每次記憶體存取都走多層表格會太慢。CPU 需要快取最近的位址轉換結果,而這個快取就是 TLB。


上一篇
VMA、mmap 與 process address space
系列文
從 Page Fault 到 OOM:Linux 記憶體管理 30 天拆解4
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言