2.1.1 Intel VT-x
由于指令的虚拟化是通过“陷入再模拟”的方式实现的,而IA32架构有19条敏感指令不能通过这种方法处理,导致出现虚拟化漏洞。为了解决这个问题,Intel VT中的VT-x技术扩展了传统的IA32处理器架构,为处理器增加了一套名为虚拟机扩展(Virtual Machine Extensions,VMX)的指令集,该指令集包含十条左右的新增指令来支持与虚拟化相关的操作,为IA32架构的处理器虚拟化提供了硬件支持。此外,VT-x引入了两种操作模式,统称为VMX操作模式。
(1)根操作模式〔VMX Root Operation〕:VMM运行所处的模式,以下简称根模式。
(2)非根操作模式(VMX Non-Root Operation):客户机运行所处的模式,以下简称非根模式。
在非根模式下,所有敏感指令(包括19条不能被虚拟化的敏感指令)的行为都被重新定义,使得它们能不经虚拟化就直接运行或通过“陷入再模拟”的方式来处理;在根模式下,所有指令的行为和传统IA32一样,没有改变,因此原有的软件都能正常运行。其基本结构如图2-2所示。
图2-2 Intel VT-x的基本结构
这两种操作模式与IA32特权级0~特权级3是正交的,即两种操作模式下都有相应的特权级0~特权级3。因此,在使用VT-x时,描述程序运行在某个特权级,应具体指明处于何种模式。
作为传统IA32架构的扩展,VMX操作模式在默认情况下是关闭的,因为传统的操作系统并不需要使用这项功能。当VMM需要使用这项功能时,可以使用VT-x提供的新指令VMXON来打开这项功能,用VMXOFF来关闭这项功能。VMX操作模式如图2-3所示。
图2-3 VMX操作模式
VMM执行VMXON指令进入到VMX操作模式,此时CPU处于VMX根操作模式,VMM软件开始运行。
VMM执行VMLAUNCH或VMRESUME指令产生VM-Entry,客户机软件开始运行,此时CPU从根模式转换成非根模式。
当客户机执行特权指令或者客户机运行发生了中断或异常时,VM-Exit被触发而陷入VMM,CPU自动从非根模式切换到根模式。VMM根据VM-Exit的原因做相应处理,然后继续运行客户机。
如果VMM决定退出,则执行VMXOFF关闭VMX操作模式。
另外,VT-x还引入了VMCS来更好地支持处理器虚拟化。VMCS是保存在内存中的数据结构,由VMCS保存的内容一般包括以下几个重要的部分:
(1)vCPU标识信息:标识vCPU的一些属性。
(2)虚拟寄存器信息:虚拟的寄存器资源,开启Intel VT-x机制时,虚拟寄存器的数据存储在VMCS中。
(3)vCPU状态信息:标识vCPU当前的状态。
(4)额外寄存器/部件信息:存储VMCS中没有保存的一些寄存器或者CPU部件。
(5)其他信息:存储VMM进行优化或者额外信息的字段。
每一个VMCS对应一个虚拟CPU需要的相关状态,CPU在发生VM-Exit和VM-Entry时都会自动查询和更新VMCS,VMM也可以通过指令配置VMCS来影响CPU。