阴影页表(对于VMM)究竟做了什么?

aer*_*ain 24 virtualization virtual-machine virtual-memory page-tables

我的理解是,影子页面表消除了模拟VM内部物理内存的需要.

即.

代替:

客户操作系统 - > VMM +虚拟物理内存 - >主机操作系统 - >主机硬件

只是:

客户操作系统 - > VMM - >主机操作系统 - >主机硬件

影子页表只允许进程正确访问主机硬件的内存.我也不明白页面错误是如何工作的(或者由于所有物理内存都由主机处理,主机负责页面错误,交换等).

小智 59

管理程序使用影子页面表来跟踪访客"认为"其页面表应该处于的状态.不允许访客访问硬件页面表,因为它基本上可以控制机器.因此,虚拟机管理程序在相关客户机执行时将"真实"映射(客户虚拟 - >主机物理)保留在硬件中,并保留客户认为正在"在阴影中"使用的页表的表示,或者至少这就是我喜欢考虑它的方式.

请注意,这避免了GVA-> GPA转换步骤.

就页面错误而言,从硬件的角度来看没有任何变化(请记住,虚拟机管理程序使得硬件使用的页面表包含GVA-> HPA映射),页面错误只会生成异常并重定向到适当的异常处理 但是,当VM运行时发生页面错误时,可以将此异常"转发"到管理程序,然后管理程序可以适当地处理它.

虚拟机管理程序必须在查看guest虚拟机生成的页面错误时构建这些阴影页表.当guest虚拟机将映射写入其中一个页表时,虚拟机管理程序将不会立即知道,因此影子页表不会立即与guest虚拟机的内容"同步".因此,管理程序将构建阴影页表,例如,以下方式:

  • Guest将VA的映射写入0xdeadbeef其页面表(内存中的某个位置),但请记住,硬件未使用此映射.
  • 访客访问0xdeadbeef,导致页面错误,因为实际页面表尚未更新以添加映射
  • 页面错误被转发到虚拟机管理程序
  • 管理程序查看客户页面表,并注意它们与阴影页表不同,"嘿,我还没有创建真正的映射0xdeadbeef"
  • 因此,它会更新其影子页面表并0xdeadbeef为要使用的硬件创建相应的- > HPA映射.

之前的情况称为影子页面错误,因为它仅由引入内存虚拟化引起.因此,页面错误的处理将停止在管理程序上,并且客户操作系统将不知道它甚至发生了.请注意,guest虚拟机还可以生成真正的页面错误,因为它尚未尝试创建映射,并且虚拟机管理程序会将这些错误转发回guest虚拟机.还要意识到整个过程意味着在guest虚拟机执行时发生的每个页面错误都必须导致退出VMM,以便阴影页面表可以保持新鲜.这很昂贵,也是为内存虚拟化引入硬件支持的原因之一.(这里是嵌套或扩展页表的一个快速介绍)

本书的一个很好的参考是本书

  • 直到刚才我才意识到`0xdeadbeef`是我OS类之外的事情. (3认同)

Jun*_*Zhi 8

当来宾将映射写入其页表之一时,管理程序不会立即知道,因此影子页表不会立即与来宾的意图“同步”。

不准确。来宾页表是只读的。每当来宾页表中有更新(例如,添加了新映射)时,它都会捕获到管理程序,并且管理程序相应地更新影子页表以与来宾“同步”。

参考:

  • 虚拟机管理程序如何知道更改的是来宾页表? (2认同)