分頁表基底暫存器(page-table base register)
/ abbr. PTBR /
想像一位文書員,每位客人都得查不同的對照表。文書員不會把每張表都背下來;桌上反而貼著一張便利貼寫道「今天這位客人的表在第 4 抽屜」。要換客人,只要把便利貼改成指向另一個抽屜即可。分頁表基底暫存器就是那張便利貼:一個小小的硬體暫存器,存著「當前」行程的分頁表在記憶體中開始的位址。
它存在的原因是這樣。分頁表太大,無法保留在 CPU 的暫存器裡,所以每個行程的分頁表都住在主記憶體中。因此 CPU 需要知道「作用中行程的表」在記憶體的何處起頭——那個起始位址正是分頁表基底暫存器(PTBR)所存的東西。要翻譯一個邏輯位址,硬體算出「PTBR 加上 頁號 乘以 項目大小」找到記憶體中正確的項目,讀出頁框號,繼續處理。發生環境切換時,作業系統不會把整張表複製到任何地方;它只是把 PTBR 重新載入為新行程的表位址。那一次微小的暫存器改動,瞬間就換掉了整張記憶體地圖。在 x86 上這個暫存器叫 CR3;許多系統會搭配一個分頁表長度暫存器,記錄有多少項目是有效的。
PTBR 之所以重要,是因為它讓切換位址空間變得便宜(寫一次暫存器),也解釋了一個關鍵的效能事實:既然表在記憶體裡,一次真正走訪表的轉譯,要付出一次記憶體存取去讀項目、再加一次去取資料——本來想要一次,卻變成兩次。這種加倍正是 TLB 全部的動機所在。常見的誤解是以為 PTBR 存著分頁表本身;其實不然——它只存表的「位址」,表仍然住在主記憶體之中。
行程 A 的分頁表起於實體位址 0x40000,行程 B 的起於 0x90000。當排程器從 A 切換到 B 時,它只把 0x90000 寫進 PTBR(x86 上的 CR3)。沒有任何表被複製;此後每次轉譯都改去讀位於 0x90000 的 B 的表。
切換位址空間只需寫一次暫存器——重新載入 PTBR,整張記憶體地圖就換了。
PTBR 只存分頁表的「位址」,而非表本身,表仍留在主記憶體裡。正因如此,走訪一次表每筆參考要付兩次記憶體存取——這正是 TLB 解決的問題。