頁表結構 (Structure of the Page Table)
本系列文章內容參考自經典教材 Operating System Concepts, 10th Edition (Silberschatz, Galvin, Gagne)。本文對應章節:Section 9.4 Structure of the Page Table。
為什麼 Page Table 也需要設計結構?
Section 9.3 已經建立 paging 的基本模型:每個 Process 有一張頁表 (Page Table),CPU 產生的 logical address 會被拆成 page number 與 offset,MMU 再用 page number 查頁表,找出對應的 physical frame。
這個模型在概念上很乾淨,但遇到大型 logical address space 時,會立刻碰到一個很現實的問題:page table 本身也要佔用記憶體。
以 32-bit logical address space 與 4 KB page size 為例:
logical address space = 2^32 bytes
page size = 2^12 bytes
number of pages = 2^32 / 2^12 = 2^20 pages
若每個 page-table entry(PTE)是 4 bytes,單一 Process 的 page table 最多需要:
2^20 entries x 4 bytes = 2^22 bytes = 4 MB
這個算式的意思不是「Process 的程式碼或資料 有 4 MB」,而是:OS 為了描述這個 Process 的 logical pages 要放在哪些 physical frames,最多需要另外準備 4 MB 的 page table metadata。
可以把 page table 想成一張表:
| Page number | Page-table entry 內容 |
|---|---|
| page 0 | page 0 目前在哪個 frame、權限 bits、valid bit 等資訊 |
| page 1 | page 1 目前在哪個 frame、權限 bits、valid bit 等資訊 |
| ... | ... |
page 2^20 - 1 | 最後一個可能 page 的 mapping 資訊 |
2^20 entries 代表這張表最多有 2^20 列,因為 32-bit address space 搭配 4 KB pages 時,整個 logical address space 會被切成 2^20 個 pages。4 bytes 代表每一列 PTE 需要 4 bytes 儲存 frame number 與控制資訊。因此整張表需要 2^20 x 4 bytes = 4 MB。
4 MB 看起來不算大,但這只是一個 Process 的頁表上限。系統同時有數十或數百個 Processes 時,光是保存 page tables 就可能消耗大量 physical memory。更重要的是,OS 不希望 page table 必須像 contiguous allocation 那樣被放在一段連續 physical memory 中,否則 paging 原本想解決的「連續配置困難」又會回到 page table 本身。
因此 Section 9.4 的核心問題是:
Paging 把 Process 的 address space 切成 pages,讓 Process 不必連續放在 physical memory。
但 page table 也可能很大,所以 page table 本身也需要被拆開、索引、快取,或換一種方向表示。
教材介紹三類常見設計:
| 結構 | 核心想法 | 主要解決的問題 |
|---|---|---|
| Hierarchical Paging | 把 page table 再切成 pages,用多層 page table 查詢 | 避免配置一整張連續的大 page table |
| Hashed Page Table | 用 virtual page number 做 hash,只保存實際需要的 mappings | 適合 64-bit 以上的大型、稀疏 address space |
| Inverted Page Table | 整個系統只用一張表,每個 physical frame 一個 entry | 降低 page table 的總記憶體用量 |
這三種設計不是在改變 paging 的基本語意。最後仍然要把 logical page 轉成 physical frame;差別在於「如何有效保存與找到這個 mapping」。