分頁與位址轉換

分頁表項目(page-table entry)

/ abbr. PTE /

把它想成圖書館某本書的目錄卡上的一行。它不只寫「214 號架」;還記著有用的事實——這本書目前在館內還是被借出?你只能在館內閱讀還是能帶回家?最近有人翻動過嗎?有人在上面寫過字嗎?分頁表項目(PTE)正是一頁的這麼一行:它不只存頁框號,還存一把「控制位元」,用來描述並管轄那一頁。

具體而言,分頁表是一個由分頁表項目構成的陣列,每頁一筆,第 p 號項目描述頁 p。最重要的欄位有:頁框號(哪個實體頁框裝著這頁);有效/無效位元(有時稱為 present)說明此項目此刻是否對應到一個真實、可存取的頁——若無效,任何存取都跳入作業系統;保護位元說明允許哪些操作(讀、寫、執行),使硬體能禁止寫入唯讀的程式碼、或禁止執行資料;參考(存取)位元,硬體只要該頁被碰觸就把它設起,供分頁置換策略找出沒在用的頁;以及修改/髒位元,硬體在該頁被寫入時把它設起,好讓作業系統知道某個頁框在重用前必須存回磁碟(乾淨的頁可以直接丟棄)。每次存取時,硬體讀出相符的 PTE、檢查這些位元,然後或繼續、或跳入作業系統。

分頁表項目之所以重要,是因為記憶體的保護、共享與虛擬記憶體,實際上就是靠它一個位元一個位元地執行。幾個誠實的重點:有效位元與保護位元做的是不同的工作——無效表示「這裡沒有對應」,而保護違規表示「有對應,但你不能那樣做」——把兩者搞混,會誤判存取為何出錯。髒位元純粹是一個最佳化提示(讓作業系統得以跳過寫回未變更的頁),而參考位元只是「最近用過」的近似;兩者都不精確,但對硬體都很便宜維護,對作業系統卻極其有用。

某共享程式庫程式碼頁的 PTE 可能是:頁框 = 88、有效 = 1、讀 = 1、寫 = 0、執行 = 1、參考 = 1、髒 = 0。對這頁的寫入嘗試會被硬體拒絕(寫 = 0)並跳入作業系統;又因髒 = 0,作業系統若哪天回收頁框 88,可不必存回就丟棄,因為磁碟上的副本仍是最新的。

一筆項目帶著頁框號,外加用來執行有效性、保護,以及追蹤使用與修改的各位元。

有效位元(「有沒有對應?」)與保護位元(「你能做什麼?」)不同——出錯可能來自其中任一個、原因各異。髒位元是一種最佳化,讓作業系統得以跳過寫回未修改的頁。

又稱
PTE頁表項分頁表項