虛擬記憶體與記憶體映射

位址轉譯(address translation)

位址轉譯(address translation)就是把一個虛擬位址變成實體位址的動作——管理員在這位住戶的私人通訊錄裡查「12 號公寓」,找到「七樓 3 室」。它在每一次記憶體存取時都會發生,一秒鐘上億次,正因如此它必須由硬體完成並做得很快。

用淺白的步驟說明方法如下。系統先固定一個分頁大小(page size),幾乎總是 4 KiB(4096 位元組)。於是一個虛擬位址被切成兩部分:高位元是虛擬分頁號碼(virtual page number),最低 12 個位元是頁內偏移量(offset)。要轉譯時,硬體拿虛擬分頁號碼去分頁表查它目前住在哪個實體頁框,再把那個頁框號碼接回原封不動的偏移量上。所以虛擬位址 0x401_7c8(分頁 0x401、偏移 0x7c8)會變成實體位址「頁框_7c8」,其中「頁框」來自表。偏移量永遠不變——轉譯只整頁搬移,從不搬動頁內的位元組。

由於每次存取都翻分頁表會慢得要命,前面擺了兩個加速器:MMU 用硬體做查表,而 TLB 快取最近的轉譯,讓大多數存取完全跳過查表。當想要的轉譯不存在或被禁止時,硬體會引發一次分頁錯誤並把控制權交給作業系統。轉譯運作正常時是看不見的,只有在 TLB 未命中或發生分頁錯誤時,才會以「成本」的形式顯現出來。

在 4 KiB 分頁下,虛擬位址 0x00401abc 切成分頁號碼 0x401 與偏移量 0xabc。若分頁表把分頁 0x401 對映到實體頁框 0x0d2,則實體位址就是 0x0d2abc——注意偏移量 0xabc 原封不動地帶過去。

換掉分頁號碼、保留偏移量——這就是整個把戲。

低位元(偏移量)不會被轉譯,只有分頁號碼會。一個常見誤解是以為整個位址會逐位元組重新對映——並不會,這正是分頁大小與對齊之所以重要的原因。

又称
paging translationvirtual-to-physical mapping位址對映