一切皆是个人理解,如有错误,望请指正。
在C语言中定义变量时,变量的地址并不是实际的物理地址。而是操作系统给分配的虚拟地址。这个虚拟地址通过地址映射得到真正的物理地址。
使用虚拟地址会使不同程序的地址空间相互隔离,提高内存的使用效率。如果直接使用物理内存进行操作的话,程序之间的地址空间可能是相连的,这样,一旦某个程序出现BUG,可能会使旁边程序的数据得到更改,从而破坏其他程序。使用虚拟地址使得不同程序的地址空间不在相连,即使程序出现问题,最多也就是使得本程序崩溃,不会影响到其他程序。
以32位系统为例,系统给每个程序都会分配4G的虚拟空间。将程序的地址存放在这块虚拟空间中,不同的程序可能会有相同的虚拟地址,但他们映射到物理地址上时物理地址是不同的。
虚拟地址与物理地址的映射可以通过分页存储管理来实现。分页存储管理的实现,各位可以在网上找那些优秀的视频或书籍来学习,个人能力有限,无法将自己所理解的讲述出来。
CPU内部的MMU可以将虚拟地址映射为物理地址。