英特尔虚拟化:VT-X、KVM和QEMU如何协同工作

2020-05-03 17:50:34

VT-x是英特尔CPU虚拟化技术的名称。KVM是使用VT-x的Linux内核的组成部分。QEMU是一个用户空间应用程序,允许用户创建虚拟机。QEMU利用KVM实现高效的虚拟化。在本文中,我们将讨论这三种技术如何协同工作。不要期望在这里对所有方面都进行深入的阐述,尽管在未来,我可能会在后面发布一些关于某些特定部分的更有针对性的帖子。

在进入主要讨论之前,让我们先谈谈一些理论。与虚拟化相关的是仿真概念-简单地说,就是伪造硬件。当您使用QEMU或VMWare创建具有ARM处理器的虚拟机,但您的主机具有x86处理器时,QEMU或VMWare将模拟或伪造ARM处理器。当我们谈论虚拟化时,我们指的是其中VM的处理器与主计算机的处理器相匹配的硬件辅助虚拟化。经常与……混为一谈。

最底层是支持虚拟化的硬件。其上方是虚拟机管理程序或虚拟机监视器(VMM)。对于KVM,这实际上是加载了KVM模块的Linux内核。换句话说,KVM是一组内核模块,当加载到Linux内核中时,它们会将内核转变为虚拟机管理程序。在虚拟机管理程序上方和用户空间中,位于最终用户直接交互的虚拟化应用程序-QEMU、VMWare等。这些应用程序然后创建虚拟机,这些虚拟机.。

最后,存在“完全”和“部分”虚拟化的二分法。完全虚拟化是指在虚拟机内运行的操作系统与在真实硬件上运行的操作系统完全相同。半虚拟化是指VM内的操作系统意识到它正在被虚拟化,因此运行方式比在真实硬件上稍有修改。

VT-x是针对Intel 64和IA-32体系结构的CPU虚拟化。英特尔的安腾有VT-I。对于I/O虚拟化,有VT-d。AMD还拥有名为AMD-V的虚拟化技术。我们只关心VT-x。

在VT-x下,CPU以两种模式之一运行:根模式和非根模式。这些模式与实数、保护、长整型等正交,也与特权环(0-3)正交。可以说,它们组成了一架新的“飞机”。虚拟机管理程序在根模式下运行,而虚拟机在非根模式下运行。在非根模式下,CPU受限代码的执行方式大多与在根模式下运行时相同,这意味着VM的CPU受限操作主要以本机速度运行。然而,它并不拥有完全的自由。

特权指令构成CPU上所有可用指令的子集。这些指令仅在CPU处于较高特权状态时才能执行,例如当前特权级别(CPL)0(其中CPL 3是最低特权)。这些特权指令的一个子集就是我们所说的“全局状态改变”指令--那些影响CPU整体状态的指令。例如,那些修改时钟或中断寄存器或写入控制寄存器的指令……。

虚拟机扩展(VMx)是为促进VT-x而添加的指令。让我们看看其中的一些,以便更好地理解VT-x是如何工作的。

VMXON:在执行此指令之前,没有根模式与非根模式的概念。CPU的运行方式就像没有虚拟化一样。必须执行VMXON才能进入虚拟化。紧接VMXON之后,CPU处于根模式。

VMLAuncH:创建VM的实例并进入非根模式。我们将在稍后介绍VMCS时解释我们所说的“VM实例”是什么意思。现在,可以将其视为在QEMU或VMWare中创建的特定VM。

当VM尝试执行在非根模式下被禁止的指令时,CPU会立即以类似陷阱的方式切换到根模式。这称为VM退出。

让我们把上面的信息综合起来。CPU在正常模式下启动,执行VMXON以根模式启动虚拟化,执行VMLAuncH以创建并进入VM实例的非根模式,VM实例运行其自己的代码,就像在本地运行一样,直到它尝试某些被禁止的操作,从而导致VM退出并切换到根模式。回想一下,在根模式下运行的软件是虚拟机管理程序。虚拟机管理程序采取行动处理VM退出的原因,然后执行VMRESUME.。

当然,上面的描述留下了一些空白。例如,虚拟机管理程序如何知道发生VM退出的原因?一个VM实例与另一个VM实例有什么不同之处?这就是VMCS的用武之地。VMCS代表虚拟机控制结构。它基本上是物理内存的4KiB部分,其中包含上述进程工作所需的信息。此信息包括VM退出的原因以及每个VM实例的唯一信息,以便在CPU处于非根模式时.。

正如您可能知道的,在QEMU或VMWare中,我们可以决定特定虚拟机将拥有多少个CPU。每个这样的CPU都称为虚拟CPU或VCP