在计算机系统中,物理内存是一种有限的资源,即使该系统支持内存扩展(多插几根内存条),但是对于内存的安装也有最大限制。物理内存不一定是连续的,它可以作为一个不同地址的集合进行访问; 此外,不同的CPU架构,甚至相同架构的不同实现,对于查看这些范围的地址也是不一样的。
基于以上原因,使得直接使用物理内存变得非常复杂,为了降低复杂度,虚拟内存应运而生。
应用程序通过虚拟内存抽象了物理内存的细节,只允许在物理内存中保留需要的信息,并且提供了一种在不同进程间的数据保护和数据共享机制。
通过虚拟内存,每个物理内存的访问都通过一个虚拟地址,当CPU从系统内存中读取(或写入)指令时,它通过MMU**,将指令中编码的虚拟地址转化为内存控制器所能理解的物理地址。**
系统的物理内存被分为段或页,页的大小取决于特定的架构实现。有些架构支持根据配置值来指定页的大小。
每个物理内存业都可以被映射为一个或多个虚拟内存页,这些映射关系保存在页表中,它是一个多维的数据集合,通过它可以将程序使用的虚拟内存地址转换为物理内存地址。
在页表中,最低维度指向应用程序实际使用内存页的物理地址,较高维度包含较低维护内存页的物理地址,在寄存器中包含了一个指向最高维护的指针。当CPU执行地址转换时,首先它通过这个寄存器来访问最高维,然后通过虚拟地址的高位在顶层中找到访问下一级别的指针,以此类推,直到页表的最低维,最终找到物理地址。