系统虚拟化——内存虚拟化

128 阅读3分钟

首先,为什么需要内存虚拟化?

我们首先要从没有使用系统虚拟化的场景说起,使用系统虚拟化之前,操作系统内核直接运行在最高特权级,因此他有权限管理整个物理地址空间,其“看到的”是从零地址开始连续增长的物理地址空间。使用系统虚拟化之后,一台物理主机上可同时运行多台虚拟机。此时每个客户操作系统“看到的”物理地址空间也应该从零开始来连续增长(否则虚拟机无法正常运行)。此外,虚拟机监控器还不允许客户操作系统访问不属于它的物理内存区域。如果此时某个客户机操作系统可以访问任意物理内存区域,它就能读取甚至修改其他虚拟机以及虚拟机监控器的内存中的数据。这破坏了虚拟机的内存隔离,会严重威胁整个系统的安全。

内存虚拟化需要满足的两个要求:

  1. 第一:为每台虚拟机提供从零开始连续增长的物理地址空间。
  2. 第二:实现虚拟机之间的内存隔离,每台虚拟机只能访问分配给它的物理内存区域。

这里需要引入一种全新类型的内存地址:客户物理地址,这是虚拟机内使用的物理地址,不是真实的、在总线中访存的地址。真正访存的物理地址被改称为主机物理地址。在虚拟机执行过程中,需要将客户物理地址转换成主机物理地址。然后,通过后者访问存储在内存中的数据和代码。相应地,虚拟机监控器需要提供一种新的地址翻译机制,将客户物理地址翻译成主机物理地址。

如下图所示:

图片

  1. 第一种是进程和客户操作系统使用的客户虚拟地址(Guest Virtual Address,GVA)
  2. 第二种是客户操作系统管理的客户物理地址(Guest Physical Address,GPA)
  3. 第三种是CPU发送至总线进行访存的主机物理地址(Host Physical Address,HPA)

客户虚拟机地址转换成客户物理地址的过程,被称为第一阶段地址翻译;客户物理地址转换成主机物理地址的过程,被称为第二阶段地址翻译;引入客户物理地址的概念之后,内存虚拟化技术可以拥有以下四个优点:

  1. 第一:可以为每一个虚拟机提供一个从零地址开始连续增长的客户物理地址空间,客户操作系统以为自己仍然管理着物理地址空间。
  2. 第二:第二阶段地址翻译可以提高主机物理内存的使用率;例如,虚拟机监控器将不连续的主机物理地址映射成连续的客户机物理地址,从而减少内存碎片。
  3. 第三:即使多个虚拟机请求的客户物理内存的大小超出主机物理内存的大小,也可以通过内存虚拟化机制同时支持多台虚拟机的执行。
  4. 第四:通过内存虚拟化机制可以实现虚拟机之间客户物理地址空间的安全隔离性。因为虚拟机监控器借助第二阶段地址翻译过程限制了每一台虚拟机的地址范围,任何虚拟机不能读写其他虚拟机中的物理内存区域(除了共享内存的情况)。