虛擬記憶體

虛擬位址(virtual address)

想想住戶私人藍圖上印的房號——「第 412 號房」。這個號碼對住戶來說是真實的、每天都在用,但它並不是任何東西在大樓裡實際所在之處;它只是一個名字,等著管理員去翻譯。虛擬位址(virtual address)就是這種名字:它是程式實際計算與使用的位址,活在程式自己私有的編號系統裡,而不是直接指向真實的記憶體晶片。

具體來說,當你的程式說「載入位址 0x7fff1234 的值」時,那個號碼就是虛擬位址。CPU 不會把它直接送到記憶體。MMU 會把它拆成兩部分——虛擬分頁號(高位元,指出是哪一頁)與位移(低位元,指出頁內的哪一個位元組)——用分頁號去查分頁表找出實體頁框,位移則保持不變。得到的結果就是記憶體晶片實際看到的實體位址。程式從不知道、也不在乎這一切發生過。

為何重要:因為每個程式都有自己一整套虛擬位址空間,兩個程式可以都用 0x400000 而互不衝突;一個程式可以被載入到任何實體位置而不必改動寫死在它裡面的位址;而沒有任何分頁對應到的位址,對該程式來說就根本不存在(碰它會引發錯誤,野指標就是這樣被抓到的)。虛擬位址空間通常遠大於安裝的 RAM——一台 64 位元機器能命名的空間大得驚人——而其中絕大部分從不對應到任何東西。

在 4 KiB 分頁下,虛擬位址 0x00403A1C 拆成分頁號 0x403 與位移 0xA1C。轉換只替換分頁號;位移 0xA1C 原封不動地進入實體位址。

虛擬位址 = (要被轉換的分頁號)+(原樣保留的位移)。

「虛擬」不代表「假的」或「慢的」——一般使用者程式中的每一道指令存取記憶體時用的都是虛擬位址,而且拜 TLB 之賜,轉換通常很快。它就是程式真實、日常使用的位址;只有它對應到硬體的方式是間接的。

又稱
logical address邏輯位址