虛擬記憶體

分頁表(page table)

想想大樓管理員的主目錄:住戶藍圖上每個房號一列,每一列寫著那個房間真正在哪——或「尚未建造」——再加上誰被允許進入。分頁表(page table)對程式來說正是這份目錄:一張查找表,為每個虛擬分頁記錄它由哪個實體頁框存放、以及在那裡可以做什麼。它是硬體在轉換位址時諮詢的唯一真相來源。

具體來說,分頁表以虛擬分頁號為索引。拿虛擬位址、丟掉位移位元、用剩下的分頁號當索引去查表;落到的那一項(分頁表項)存著實體頁框號加上控制位元——有效位元(這頁在記憶體裡嗎?)、保護位元(讀/寫/執行)、通常還有髒位元與參考位元。每個執行中的程式都有自己的分頁表,作業系統在每次情境切換時切換哪張表是「使用中」(把它的基底位址載入一個叫分頁表基底暫存器的特殊暫存器)——這正是為何兩個程式可以安全地使用相同虛擬位址。

為何重要:分頁表是重定位、保護與存在與否全都棲身之處,由作業系統擁有與維護、由硬體諮詢——是硬體與作業系統協同設計最乾淨的例子。誠實的問題:一張平坦地對應整個 64 位元位址空間的分頁表,本身會大到驚人(遠大於 RAM),所以真實系統絕不平坦地儲存它;它們改用多層(階層式)分頁表或反轉分頁表,並把熱項目快取在 TLB 中,好讓多數轉換根本不必查表。

一張迷你分頁表:分頁 0 -> 頁框 90(有效、可讀寫);分頁 1 -> 頁框 12(有效、唯讀);分頁 2 ->(無效、在磁碟上)。存取分頁 2 發現有效位元為 0,便觸發分頁錯誤。

每個虛擬分頁一列:頁框號加上有效與保護位元。

分頁表本身就住在實體記憶體裡,所以單純的轉換光是讀它就需要一次記憶體存取——讓記憶體流量加倍。TLB 的存在就是為了快取這些項目,好讓常見情況省去那次額外存取。

又称
address-space map頁表