實體位址(physical address)
回到公寓大樓:實體位址就是真實大樓裡那個真實的櫃子——「二樓、北牆、第三個櫃子」。住戶從來看不到這些;只有管理員在這套真實座標系統裡工作,因為東西實際上就放在這裡。實體位址(physical address)是真實記憶體晶片上的真正位置:那個會沿著記憶體匯流排送出去、用來選中某個真實 DRAM 位元組的號碼。
具體來說,實體位址就是虛擬位址經過轉換後變成的東西。MMU 拿虛擬分頁號去查出實體頁框號,再把這個頁框號與原封不動的位移接起來,組成實體位址。所以如果虛擬分頁 0x403 目前對應到實體頁框 0x1F7,那麼虛擬位址 0x00403A1C 就變成實體位址 0x001F7A1C——位移同樣是 0xA1C,高位部分換新。這個實體位址才是記憶體控制器與 DRAM 真正聽得懂的。所有實體位址的集合,受限於你安裝了多少 RAM。
為何這個區別重要:實體位址空間是真實、共享、有限的資源,而每個程式的虛擬空間則是私有且可能很大。虛擬記憶體的全部工作,就是安全地、一頁框接一頁框地,把眾多程式的大虛擬空間多工到一個有限的實體空間上。快取與記憶體階層最終以實體位址運作(有個微妙之處:某些快取會用虛擬位元來索引,好在轉換完成前就開始查找)。把兩者搞混——以為程式的位址 0x400000 就是 RAM 裡某個固定地點——是初學者的經典錯誤。
兩個程式都從虛擬位址 0x400000 載入。程式 A 的分頁對應到實體頁框 0x1F7、程式 B 的對應到頁框 0x2C0——於是記憶體晶片看到兩個不同的實體位址,資料絕不會互通。
兩個程式中相同的虛擬位址,變成不同的實體位址——這正是隔離的實際運作。
程式幾乎從不直接看到實體位址;只有作業系統與硬體會。但使用 DMA 的裝置可能以實體位址(或 I/O 虛擬位址)運作,這正是 DMA 與虛擬記憶體需要小心協調的原因之一。