虚拟内存(Virtual Memory) 是计算机系统内存管理非常重要的一个技术,本质上来说它只是逻辑存在的,是一个假想出来的内存空间,主要作用是作为进程访问主存(物理内存)的桥梁并简化内存管理。

img

物理地址:是真正的物理地址,内存地址寄存器中的地址。
虚拟地址:程序访问的是这个地址。
通过 MMU 将虚拟地址转换为物理地址后,再通过总线传到物理内存设备,进而完成相应的物理内存读写请求。
img

虚拟地址翻译为物理地址机制

分段机制

分段机制(Segmentation) 以段(一段 连续 的物理内存)的形式管理/分配物理内存。应用程序的虚拟地址空间被分为大小不等的段,段是有实际意义的,每个段定义了一组逻辑信息,例如有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等。

简单来说,就是通过段表来进行映射虚拟地址和物理地址,包含:

  • 段号:标识着该虚拟地址属于整个虚拟地址空间中的哪一个段。
  • 段内偏移量:相对于该段起始地址的偏移量。

翻译过程就是:

  1. MMU 首先解析得到虚拟地址中的段号;
  2. 通过段号去该应用程序的段表中取出对应的段信息(找到对应的段表项);
  3. 从段信息中取出该段的起始地址(物理地址)加上虚拟地址中的段内偏移量得到最终的物理地址。
    img

缺点

容易造成内存外部碎片
img

分页机制

分页管理通过 页表(Page Table) 映射虚拟地址和物理地址。

分页机制下的虚拟地址由两部分组成:

  • 页号:通过虚拟页号可以从页表中取出对应的物理页号;
  • 页内偏移量:物理页起始地址+页内偏移量=物理内存地址。

翻译过程:

  • MMU 首先解析得到虚拟地址中的虚拟页号;
  • 通过虚拟页号去该应用程序的页表中取出对应的物理页号(找到对应的页表项);
  • 用该物理页号对应的物理页起始地址(物理地址)加上虚拟地址中的页内偏移量得到最终的物理地址。

单级页表

img