虚拟地址到物理地址(内存虚拟化)
假设一个堆的基地址为34KB,虚拟地址为4KB,其大小为2KB
当 程序不分段时 ,找到堆中虚拟地值的物理地址很简单,物理地址 = 基地址 + 虚拟地址
当 程序分段时 ,找到堆中物理地址会复杂一些,物理地址 = 基地址 + (虚拟地址 - 该段的开头的虚拟地址)
举个例子,堆中有一个虚拟地址为4200,那么如果想得到其物理地址,需 34KB + 4200 - 4 KB = 34920
你可能好奇为什么要这么做,我们来简单解释一下:
首先我们先明确,之所以使用虚拟地址是想让程序以为自己独占内存,也就是说程序所占内存是从0 - xxx。虚拟地址是多少,就表示其在第多少个内存空间
当不分段时:整个程序的内存空间连续(无论是程序以为的内存空间还是物理内存都是连续的),所以虚拟地址即表明了其是第几个内存空间。显然 物理地址 = 基地址 + 虚拟地址
当分短时:整个程序的内存空间不再连续,每一段都有自己独特的基地址,但是虚拟地址还是相对于之前只有一个基地址时的值,那么此时虚拟地址就无法直接表示其在第几个内存空间了(因为程序以为的连续内存空间映射成的物理内存并不连续)。所以,我们需要虚拟地址相对于每个段自己的基地址的值,要完成这个操作只需要将虚拟地址 - 段开头的虚拟地址。因此 物理地址 = 基地址 + 虚拟地址 - 段开头的虚拟地址
2024-10-23 广告