虚拟地址到物理地址(内存虚拟化)

假设一个堆的基地址为34KB,虚拟地址为4KB,其大小为2KB

程序不分段时,找到堆中虚拟地值的物理地址很简单,物理地址 = 基地址 + 虚拟地址

程序分段时,找到堆中物理地址会复杂一些,物理地址 = 基地址 + (虚拟地址 - 该段的开头的虚拟地址)
举个例子,堆中有一个虚拟地址为4200,那么如果想得到其物理地址,需 34KB + 4200 - 4 KB = 34920

你可能好奇为什么要这么做,我们来简单解释一下:
首先我们先明确,之所以使用虚拟地址是想让程序以为自己独占内存,也就是说程序所占内存是从0 - xxx。虚拟地址是多少,就表示其在第多少个内存空间

当不分段时:整个程序的内存空间连续(无论是程序以为的内存空间还是物理内存都是连续的),所以虚拟地址即表明了其是第几个内存空间。显然 物理地址 = 基地址 + 虚拟地址

当分短时:整个程序的内存空间不再连续,每一段都有自己独特的基地址,但是虚拟地址还是相对于之前只有一个基地址时的值,那么此时虚拟地址就无法直接表示其在第几个内存空间了(因为程序以为的连续内存空间映射成的物理内存并不连续)。所以,我们需要虚拟地址相对于每个段自己的基地址的值,要完成这个操作只需要将虚拟地址 - 段开头的虚拟地址。因此 物理地址 = 基地址 + 虚拟地址 - 段开头的虚拟地址

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容