虛擬記憶體

位址轉換(address translation)

想像一位櫃台人員,他唯一的工作就是把訪客報出的房號(「第 412 號房」)查目錄轉換成大樓的真實位置(「北翼、第 503 號櫃」)——並且若第 412 號房不是這位訪客能進的,就拒絕他。位址轉換(address translation)正是這種查找加檢查,在每一次記憶體存取時都執行,把程式的虛擬位址轉成記憶體晶片聽得懂的實體位址,同時執行權限管控。

具體來說,轉換以分頁為單位進行。虛擬位址拆成虛擬分頁號與位移。分頁號用來索引分頁表;對應的項目給出一個實體頁框號,加上一個有效位元與一些保護位元。硬體檢查有效位元(這一頁在記憶體裡嗎?)與保護位元(這次的讀/寫/執行被允許嗎?)。若一切無誤,就把實體位址組成(頁框號、位移),存取繼續。若分頁不在記憶體中,就引發分頁錯誤陷入作業系統;若違反保護,也會引發錯誤(通常會終止程式)。為了避免每次都付出整套分頁表走訪的代價,最近的轉換會被快取在 TLB 中。

為何重要:轉換是讓整個錯覺成真的機制,而且它位在每一次載入與儲存的關鍵路徑上,所以必須快——這正是為什麼由硬體(MMU 與 TLB)來做,而不是軟體。它同時統合了好幾項功能:重定位(任何虛擬分頁都能對應到任何頁框)、保護(逐頁的權限檢查)與共享(兩張分頁表可以指向同一個頁框)。誠實的代價:一次 TLB 未命中會迫使較慢的分頁表走訪,這份額外開銷乘上數十億次存取後,是真實存在的。

在 4 KiB 分頁下轉換虛擬位址 0x00403A1C:拆成分頁 0x403 + 位移 0xA1C;分頁表說分頁 0x403 住在頁框 0x1F7 且可讀;組成實體位址 0x001F7A1C 並讀取。

一次轉換:查分頁、檢查權限、保留位移、輸出實體位址。

轉換發生在每一次存取,而非載入時只做一次。這正是為何硬體 TLB 不可或缺——沒有它,每一次記憶體參考都得多花幾次記憶體參考只為了讀分頁表。

又称
virtual-to-physical translation虛實位址轉換