CPU 模式和递归虚拟化

CPU 模式和递归虚拟化

我正在尝试理解虚拟化和虚拟机管理程序。

因此,顶级操作系统(例如 Linux)在 ring 0 中运行,而用户空间程序在 ring 3 中运行。用户启动 VMware,Linux 在其中运行。虚拟 Linux 在哪些 ring/模式下运行?假设用户在虚拟 Linux 操作系统中启动另一个虚拟 Linux 操作系统?VMware 是否模拟了其他模式?如何将所有这些层分开以防止故障和恶意行为?

上述内容在不同平台上的实现方式是否不同?Intel VT、AMD-V、ARM、纯软件虚拟化等?

答案1

本文应该会提供很多您正在寻找的信息。但是,它特定于 VMware。

一般情况下,这实际上取决于许多因素:

  • 是否正在使用 VT-x / AMD-V?
  • EPT 正在使用吗?
  • 是否使用 VT-d 或某种类型的 IOV?

上述问题是硬件指令使用问题。根据使用哪种 AMD/Intel CPU 硬件指令来协助虚拟化,虚拟机管理程序的结构通常会有很大不同。如果如果正在使用硬件指令,则虚拟机被称为“完全模拟”或“在软件中运行”,这通常是最慢的模式。但是,即使没有硬件支持,半虚拟化(客户操作系统知道它在虚拟机中运行)通过在客户机和主机之间提供明确的编程接口,甚至可以显著加速软件仿真层。

一些虚拟机,例如没有 kqemu 或 kvm 的 qemu,可以运行完全在第 3 环——但这样做有几个限制,例如性能和缺乏低级硬件访问。一般来说,即使是那些没有任何硬件加速的虚拟机管理程序传统上也在 ring 0 中运行,即在主机内核中作为驱动程序运行。

使用 ring 1 和 ring 2 的情况相当少见,但确实存在,正如 Anandtech 文章中所述。此外,ring 1 和 ring 2 通常用于 Xen 等裸机虚拟机管理程序。据我所知,Xen 中的“dom0”主机操作系统内核完全在 ring 1 中运行,仅有的Xen“微内核”在 ring 0 中运行。因此,如果 Linux 是 dom0,那么它将在 ring 1 中运行,而客户机(domU)内核将由 Ring 0 中的 Xen 进行超级管理并在 ring 2 中运行。

当然,处理器的“环”并不是唯一的安全或隔离机制,硬件指令为安全地分离虚拟机,而不必在软件中完成所有操作。如果您需要详细信息,最好通过阅读英特尔处理器的编程手册来获取,特别是有关 VT-x 的主题。

嵌套虚拟化通常是不可能的,除非在 VMware 的情况下(它是我所知道的唯一可以做到这一点的虚拟机管理程序)。它通过以下方式实现这一点模仿客户机中的 VT-x 指令(可能还有 EPT),从而使客户机认为它具有真正的 VT-x/EPT 支持。这可能是虚拟机管理程序的诡计,尽管我不知道实现细节。但是,EPT 通常被称为“嵌套页表”,所以我想知道“嵌套”方面是否意味着您可以创建比将主机的页表与客户机分开所需的更深一层的嵌套。

对于嵌套虚拟化来说,更常见的情况是,您只能运行“完全模拟”或最好是半虚拟化——这会对性能造成很大的影响。

说到性能,我认为如果可以避免的话,大多数人都不会使用嵌套虚拟化,除非嵌套容器虚拟化(不产生任何 CPU/内存/硬件开销)。即使使用 VMware 的虚拟化 VT-x,性能影响也非常大,以至于任何潜在的隔离优势都被抵消了。相信我,一个级别的虚拟化就足够了,除非我们到达一个硬件节点,在这个节点上,嵌套得更深是切实可行的,并且能够消除间接级别的性能影响。

相关内容