假設一個堆的基地址為34KB,虛擬地址為4KB,其大小為2KB
當程序不分段時,找到堆中虛擬地值的物理地址很簡單,物理地址 = 基地址 + 虛擬地址
當程序分段時,找到堆中物理地址會復雜一些,物理地址 = 基地址 + (虛擬地址 - 該段的開頭的虛擬地址)
舉個例子,堆中有一個虛擬地址為4200,那么如果想得到其物理地址,需 34KB + 4200 - 4 KB = 34920
你可能好奇為什么要這么做,我們來簡單解釋一下:
首先我們先明確,之所以使用虛擬地址是想讓程序以為自己獨占內存,也就是說程序所占內存是從0 - xxx。虛擬地址是多少,就表示其在第多少個內存空間
當不分段時:整個程序的內存空間連續(xù)(無論是程序以為的內存空間還是物理內存都是連續(xù)的),所以虛擬地址即表明了其是第幾個內存空間。顯然 物理地址 = 基地址 + 虛擬地址
當分短時:整個程序的內存空間不再連續(xù),每一段都有自己獨特的基地址,但是虛擬地址還是相對于之前只有一個基地址時的值,那么此時虛擬地址就無法直接表示其在第幾個內存空間了(因為程序以為的連續(xù)內存空間映射成的物理內存并不連續(xù))。所以,我們需要虛擬地址相對于每個段自己的基地址的值,要完成這個操作只需要將虛擬地址 - 段開頭的虛擬地址。因此 物理地址 = 基地址 + 虛擬地址 - 段開頭的虛擬地址