为什么 VirtualBox 来宾内核在环 1 而不是环 3 中运行?

cat*_*man 8 virtualbox virtualization x86

VirtualBoxx86平台上运行时,根据文档

当启用硬件虚拟化(即 VT-x 或 AMD-V)时,管理程序(即 VirtualBox 本身)以VMX 根模式(又名ring -1)运行,而虚拟机以VMX 非根模式(又名ring 0)运行. 这也是其他管理程序的工作方式。

另一方面,当硬件虚拟化不可用时,会使用软件虚拟化,并且来宾内核在环 1 中运行。从上面链接的第 10.6 节

  • 访客环 3 代码未经修改,全速运行,尽可能多......

  • 对于 ring 0 中的来宾代码,Oracle VM VirtualBox 使用了一个巧妙的技巧。它实际上重新配置了来宾,以便它的 ring-0 代码改为在 ring 1 中运行,这在 x86 操作系统中通常不使用)。结果,当guest ring-0代码,实际运行n ring 1,例如guest设备驱动程序尝试写入I/O寄存器或执行特权指令时,Oracle VM VirtualBox hypervisor在“真实”ring 0可以接手

...

  • 在 ring 1 中运行 ring 0 代码会导致很多额外的指令错误,因为ring 1 不允许执行任何特权指令,其中 guest 的 ring-0 包含很多特权指令。对于这些故障中的每一个,VMM 都必须介入并模拟代码以实现所需的行为。虽然这样做有效,但模拟数千个此类故障的成本非常高,并且会严重损害虚拟化客户的性能。

这很有趣,因为它是我遇到的环 1 的唯一应用程序。

根据上面引用的部分,即使来宾内核在环 1 中运行,当来宾设备驱动程序尝试写入 I/O 寄存器或执行特权指令时,VirtualBox 管理程序(环 0)也需要接管。因此,无论来宾内核是在环 1 还是环 3 中运行,似乎由于软件虚拟化而导致的性能损失是相同的。

我确实遇到过这个SO 帖子,上面写着:

环 1 和环 2 在某种程度上“主要”享有特权。他们可以访问主管页面,但如果他们尝试使用特权指令,他们仍然会像环 3 那样 GPF。因此,正如英特尔计划的那样,对于驱动程序来说,这不是一个糟糕的地方......

问题

  1. 在环 1 而不是环 3 中运行来宾内核如何提高性能。

  2. 在环 1 中运行来宾内核(从而使来宾内核“访问主管页面”)的安全含义是什么?

cat*_*man 6

我从 freenode 上 #vbox-dev 以及其他在线资源的人们那里得到了一些非常有用的答案。

  1. 它不会提高性能。正如 VirtualBox 文档中提到的,来宾用户空间在环 3 中运行,来宾内核空间在环 1 中运行。这允许通过分页保护来宾内核空间免受来宾用户空间的影响(参见幻灯片 19)。下面解释如何使用分页来实现这种保护。

    https://manybutfinite.com/post/cpu-rings-privilege-and-protection/

    每个内存页面都是一个字节块,由一个包含两个与保护相关的字段的页表条目描述:一个管理标志和一个读/写标志。主管标志是内核使用的主要 x86 内存保护机制。当它打开时,无法从环 3 访问该页面。虽然读/写标志对于强制执行权限没有那么重要,但它仍然很有用。

  2. 好消息是客人不能执行特权指令,因为只有环 0 可以这样做。坏消息是在 64 位系统上,ring 1 可能可以访问主机的内存页面。这是因为在 64 位模式下,段限制不再适用,因为分段已大部分替换为分页。不幸的是,在内存隔离方面,分页无法区分 0-2 级权限。这个问题被称为环压缩见幻灯片 19)。

    https://cseweb.ucsd.edu/~jfisherogden/hardwareVirt.pdf

    环压缩

    为了在虚拟机之间提供隔离,VMM 在环 0 中运行,而虚拟机在环 1(0/1/3 模型)或环 3(0/3/3 模型)中运行。虽然 0/1/3 模型更简单,但在支持 x86 架构(AMD64 和 EM64T)的 64 位扩展的 CPU 上以 64 位模式运行时无法使用。

    为了保护 VMM 免受来宾操作系统的影响,可以使用分页或段限制。但是,64 位模式不支持段限制,并且 x86 上的分页不区分环 0、1 和 2。这导致环压缩,其中来宾操作系统必须在环 3 中运行,不受用户应用程序的保护。

    上面的段落表明,在 64 位系统上,由于分段被删除,来宾内核和来宾用户空间都必须环 30/3/3 模型)中运行,以保护主机免受来宾的攻击。然而,请参阅幻灯片 37表明,可以通过非常复杂的二进制转换(BT)来维护0/1/3 模型并防止环 1 访问主机。也许这就是 VirtualBox 实施的策略?

重要的是要记住,整个讨论仅与完整的软件虚拟化有关,因此已经过时了,因为很少有 CPU 不支持硬件虚拟化。正如#vbox-dev 的某人指出的那样。

不过,软件虚拟化是一个垂死的物种。很少有 CPU 没有硬件虚拟化支持。在某些时候,我们将不得不做出艰难的决定——让代码保持活力需要时间和金钱。