Intel VT中的VT-x技术扩展了传统的IA32处理器架构,为IA32架构的处理器虚拟化提供了硬件支持。
首先,VT-x引入了两种操作模式,统称为VMX操作模式。
-
根操作模式(VMX Root Operation):VMM运行所处的模式,以下简称根模式。
-
非根操作模式(VMX Non-Root Operation):客户机运行所处的模式,以下简称非根模式。
这两种操作模式与IA32特权级0至特权级3是正交的,即每种操作模式下都有相应的特权级03。故在VT-x使用的情况下,描述程序运行在某个特权级,例如特权级0,还必须指出当前是处在根模式还是非根模式
引入两种操作模式的理由很明显。指令的虚拟化是通过“陷入再模拟”的方式实现的,而IA32架构有19条敏感指令不能通过这种方式处理,导致了虚拟化漏洞。最直观的解决办法,是使得这些敏感指令能够触发异常。可惜这种方法会改变这些指令的语义,导致与原有软件不兼容,这是不可接受的。引入新的模式可以很好地解决问题。非根模式下所有敏感指令(包括19条不能被虚拟化的敏感指令)的行为都被重新定义,使得它们能不经过虚拟化就直接运行或通过“陷入再模拟”的方式来处理;在根模式下,所有指令的行为和传统IA32一样,没有改变,因此原有的软件都能正常运行。
VT-x中,非根模式下敏感指令引起的“陷入”被称为VM-Exit。VM-Exit发生时,CPU自动从非根模式切换为根模式。相应地,VT-x也定义了VM-Entry,该操作由VMM发起,通常是调度某个客户机运行,此时CPU从根模式切换成为非根模式。
其次,为了更好地支持CPU虚拟化,VT-x引入了VMCS(Virtual-Machine Control Structure,虚拟机控制结构)。VMCS保存虚拟CPU需要的相关状态,例如CPU在根模式和非根模式下的特权寄存器的值。VMCS主要供CPU使用,CPU在发生VM-Exit和VM-Entry时都会自动查询和更新VMCS。VMM可以通过指令来配置VMCS,进而影响CPU的行为。
最后,VT-x还引入了一组新的指令,包括VMLAUCH/VMRESUME用于发起VM-Entry,VMREAD/VMWRITE用于配置VMCS等。
VMCS
VMCS的概念和虚拟寄存器的概念类似,可以看作是虚拟寄存器概念上在硬件上的应用。虚拟寄存器的操作和更改完全由软件执行,但VMCS却主要由CPU操作。VMCS是保存在内存中的数据结构,包含了虚拟CPU的相关寄存器的内容和虚拟CPU相关的控制信息,每个VMCS对应一个虚拟CPU。
VMCS在使用时需要与物理CPU绑定。在任意给定时刻,VMCS与物理CPU是一对一的绑定关系,即一个物理CPU只能绑定一个VMCS,一个VMCS也只能与一个物理CPU绑定。VMCS在不同的时刻可以绑定到不同的物理CPU,例如在某个VMCS先和物理CPU1绑定,并在某一个时刻解除绑定关系,并重新绑定到物理CPU2。这种绑定关系的变化被称为VMCS的迁移(Migration)。
VT-x提供了两条指令用于VMCS的绑定与解除绑定。
-
VMPTRLD<VMCS地址>:将指定的VMCS与执行该指令的物理CPU绑定。
-
VMCLEAR:将执行该指令的物理CPU与它的VMCS解除绑定。该指令会将物理CPU缓存中的VMCS结构同步到内存中去,从而保证VMCS和新的物理CPU绑定时,内存中的值是最新的。
VMCS的一次迁移过程如下:
-
在CPU1上执行VMCLEAR,解除绑定。
-
在CPU2上执行VMPTRLD,进行新的绑定。
VT-x定义了VMCS的具体