虛擬地址到物理地址(內存虛擬化)

假設一個堆的基地址為34KB,虛擬地址為4KB,其大小為2KB

程序不分段時,找到堆中虛擬地值的物理地址很簡單,物理地址 = 基地址 + 虛擬地址

程序分段時,找到堆中物理地址會復雜一些,物理地址 = 基地址 + (虛擬地址 - 該段的開頭的虛擬地址)
舉個例子,堆中有一個虛擬地址為4200,那么如果想得到其物理地址,需 34KB + 4200 - 4 KB = 34920

你可能好奇為什么要這么做,我們來簡單解釋一下:
首先我們先明確,之所以使用虛擬地址是想讓程序以為自己獨占內存,也就是說程序所占內存是從0 - xxx。虛擬地址是多少,就表示其在第多少個內存空間

當不分段時:整個程序的內存空間連續(xù)(無論是程序以為的內存空間還是物理內存都是連續(xù)的),所以虛擬地址即表明了其是第幾個內存空間。顯然 物理地址 = 基地址 + 虛擬地址

當分短時:整個程序的內存空間不再連續(xù),每一段都有自己獨特的基地址,但是虛擬地址還是相對于之前只有一個基地址時的值,那么此時虛擬地址就無法直接表示其在第幾個內存空間了(因為程序以為的連續(xù)內存空間映射成的物理內存并不連續(xù))。所以,我們需要虛擬地址相對于每個段自己的基地址的值,要完成這個操作只需要將虛擬地址 - 段開頭的虛擬地址。因此 物理地址 = 基地址 + 虛擬地址 - 段開頭的虛擬地址

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容