虛擬記憶體與記憶體映射
分頁表(page table)
分頁表(page table)就是管理員的私人通訊錄:對每位住戶(每個行程),它逐頁記錄那一頁目前坐落在哪個實體頁框,或它還沒有歸宿。它是讓位址轉譯得以成立的資料結構——從虛擬分頁號碼查到實體頁框號碼的查表。
在最簡單的圖像裡,分頁表是一個以虛擬分頁號碼為索引的大陣列,每個格子是一筆分頁表項(page-table entry),裝著一個頁框號碼加上一些旗標位元(存在、可寫、可執行等等)。要轉譯時,硬體拿虛擬分頁號碼當索引去查這個陣列、讀出該項、得到頁框。每個行程都有自己的分頁表,這正是定址空間私有的原因:作業系統切換到某個行程時會換上對應的表,於是同一個虛擬位址此刻就指向那個行程的資料。一個特殊的 CPU 暫存器(x86-64 上的 cr3)保存著目前行程頂層表的實體位址。
不過這裡有個規模問題,這也是為什麼真實的分頁表不是一個扁平陣列。64 位元定址空間大得驚人;一個涵蓋它的扁平表所需的記憶體比存在的還多。解法是多層分頁表——一棵只把你真正用到的分支實體化的樹——下一條介紹。要帶走的關鍵概念是:分頁表是每行程一份、住在實體記憶體裡,並在 TLB 未命中時由硬體讀取。
行程 A 的分頁表把虛擬分頁 0x10 對映到頁框 0x3c2;行程 B 的表把它自己的虛擬分頁 0x10 對映到頁框 0x88f。兩個行程都能用位址 0x10000 並各自拿到自己的資料,因為作業系統在每次上下文切換時(透過 cr3)換掉作用中的分頁表。
每行程一份的表,正是同一個虛擬位址各有其意的原因。
分頁表住在實體 RAM、由作業系統管理,而非由你的程式管理——你永遠不會從 C 直接讀寫它。切換行程意味著切換分頁表,這也是上下文切換並非免費的部分原因。
又称
另见