位址轉譯(address translation)
假設你的辦公室給每個人一個從 1 開始編號的私人信箱,而後勤室有位文書員拿著一張對照表,把每個人的私人信箱號對應到郵件真正擺放的那個架子。你把私人號碼交給文書員;他查表後走去真正的架子。位址轉譯就是記憶體的那位文書員:程式使用從 0 開始、親切的邏輯位址,而在「每一次」存取時,硬體都會在碰記憶體之前,悄悄把每個邏輯位址變成真正的實體位址。
一步步來看,在分頁下轉譯是這樣進行的。(1) CPU 產生一個邏輯位址。(2) 硬體把它切成頁號 p 與偏移 d。(3) 它用 p 去索引分頁表(經由分頁表基底暫存器找到表),讀出存在那裡的頁框號 f。(4) 它檢查該項目的位元——這一頁有效嗎?這次存取(讀、寫、執行)獲准嗎?——若否就跳入作業系統。(5) 它把頁框 f 與不變的偏移 d 組合成實體位址,再把這個實體位址送往記憶體。這一切都由硬體記憶體管理單元(MMU)對「每一次」載入、儲存、指令擷取執行——次數多到軟體根本來不及做。轉譯後備緩衝區會快取最近的(頁 → 頁框)結果,使大多數轉譯完全略過讀分頁表這一步。
位址轉譯之所以重要,是因為它是那套隱形的機械裝置,讓每個行程都擁有自己乾淨、隔離的位址空間,同時又全都共用同一塊實體記憶體。它是記憶體保護的執法點(被禁止的存取就在這裡被攔下),也是虛擬記憶體賴以掛載的鉤子(缺頁就在這裡被偵測並觸發分頁錯誤)。誠實的提醒是效能:因為它發生在每次存取上,所以必須快到硬體等級,這正是 TLB 與設計良好的分頁表結構並非奢侈品、而是必需品的原因。
CPU 發出頁 3、偏移 50 的邏輯位址。MMU 索引分頁表第 3 號項目,找到頁框 5,檢查有效位元與寫入位元,然後發出實體位址「頁框 5, 偏移 50」。若第 3 號項目被標為無效,MMU 反而會跳入作業系統。
每次記憶體存取都由硬體轉譯:切分、查頁框、檢查位元、再與偏移重組。
轉譯發生在「每一次」記憶體存取上,由硬體(MMU)完成,而非軟體——軟體實在太慢。它同時也是保護的執法之處,以及分頁錯誤誕生之地。