实模式Guest的访存

实模式Guest的访存

实模式Guest的访存 #

正常情况下,当一个 Host 系统中启动运行 Guest 系统时,此时的 Host 是处于保护模式的,而 Guest 则因为刚启动,所以需要运行在实模式下。此时又碰到一个问题,Guest 里实模式的代码又如何运行在 Host 处于保护模式下的 CPU 上呢?

这个问题同样需要硬件来支持。在 x86 体系的 CPU 中,可以支持一种虚拟 8086 的模式,这个模式又被称为虚拟 - 实模式,意思是可以让 CPU 在保护模式下来运行实模式的程序。当然这里虚拟 8086 模式下访问的地址,并不意味着程序跟实模式一样,就可以直接访问 Host 的真实物理地址了,只是说在该模式下,程序可以采用同实模式下一样的寻址方式,但访问的地址还是 Host 的虚拟地址,但在 Guest 自己看来,它认为自己访问的是 Guest 的物理地址 (Guest Physical Address,GPA)。

这种情况下,Guest 代码中的逻辑地址到 Host 的物理地址(Host Physical Address, HPA)的转换主要分为三个步骤:

  1. 我们知道实模式下程序访存时是通过段式寻址的方式,也就是说,Guest 程序的逻辑地址可以通过分段机制转换为 GPA,这个过程是由 Guest 模式下 CPU 自发地进行,需要 CPU 运行在上边提到的虚拟 8086 模式下;
  2. Guest 的物理内存可以由 VMM 转换到 Host 的虚拟内存地址(Host Virtual Address,HVA)。这一步的转换过程可以由 VMM 内部维护的数据结构进行查表得出;
  3. 最后一步的转换也是由 VMM 直接调用缺页中断服务函数 (get_user_pages) 将 Host 的虚拟内存映射到物理页。你要注意的是,这一步是 VMM 主动调用的,而不是由中断触发的。

我们知道,在物理机上进行虚拟地址与物理地址转换的话,需要 cr3 寄存器来存放页表。因此,在 Guest 的实模式下,为了能够获取到实际运行的物理地址,我们需要在 VM Enter 的过程中将 cr3 寄存器设置成 VMM 为 Guest 准备的页表。

Viewpoint #

From #

12 | 内存虚拟化:云原生时代的奠基者

虚拟化技术的三个核心角色