2005 年冬天,英特尔带来了业内首个面向台式机的硬件辅助虚拟化技术 Intel-VT 及相关的处理器产品,从而拉开了 IA 架构虚拟化技术应用的新时代大幕。支持虚拟化技术的处理器带有特别优化过的指令集来自动控制虚拟化过程,从而极大简化 VMM 的设计,VMM 的性能也能获得很大提升。其中 IA-32 处理器的虚拟化技术称为 VT-x,安腾处理器的虚拟化技术称为 VT-i。AMD 公司也推出了本身的虚拟化解决方案,称为 AMD-V。尽管 Intel-VT 和 AMD-V 并不彻底相同,可是基本思想和数据结构倒是类似的,本文只讨论 Intel-VT-x 技术。html
VT-x 为 IA 32 处理器增长了两种操做模式:VMX root operation 和 VMX non-root operation。VMM 本身运行在 VMX root operation 模式,VMX non-root operation 模式则由 Guest OS 使用。两种操做模式都支持 Ring 0 ~ Ring 3 这 4 个特权级,所以 VMM 和 Guest OS 均可以自由选择它们所指望的运行级别。linux
这两种操做模式能够互相转换。运行在 VMX root operation 模式下的 VMM 经过显式调用 VMLAUNCH 或 VMRESUME 指令切换到 VMX non-root operation 模式,硬件自动加载 Guest OS的上下文,因而 Guest OS 得到运行,这种转换称为 VM entry。Guest OS 运行过程当中遇到须要 VMM 处理的事件,例如外部中断或缺页异常,或者主动调用 VMCALL 指令调用 VMM 的服务的时候(与系统调用相似),硬件自动挂起 Guest OS,切换到 VMX root operation 模式,恢复 VMM 的运行,这种转换称为 VM exit。VMX root operation 模式下软件的行为与在没有 VT-x 技术的处理器上的行为基本一致;而VMX non-root operation 模式则有很大不一样,最主要的区别是此时运行某些指令或遇到某些事件时,发生 VM exit。数据结构
VMM 和 Guest OS 共享底层的处理器资源,所以硬件须要一个物理内存区域来自动保存或恢复彼此执行的上下文。这个区域称为虚拟机控制块(VMCS),包括客户机状态区(Guest State Area),主机状态区(Host State Area)和执行控制区。VM entry 时,硬件自动从客户机状态区加载 Guest OS 的上下文。并不须要保存 VMM 的上下文,缘由与中断处理程序相似,由于 VMM 若是开始运行,就不会受到 Guest OS的干扰,只有 VMM 将工做完全处理完毕才可能自行切换到 Guest OS。而 VMM 的下次运行必然是处理一个新的事件,所以每次 VMM entry 时, VMM 都从一个通用事件处理函数开始执行;VM exit 时,硬件自动将 Guest OS 的上下文保存在客户机状态区,从主机状态区中加载 VMM 的通用事件处理函数的地址,VMM 开始执行。而执行控制区存放的则是能够操控 VM entry 和 exit 的标志位,例如标记哪些事件能够致使 VM exit,VM entry 时准备自动给 Guest OS “塞”入哪一种中断等等。架构
客户机状态区和主机状态区都应该包含部分物理寄存器的信息,例如控制寄存器 CR0,CR3,CR4;ESP 和 EIP(若是处理器支持 64 位扩展,则为 RSP,RIP);CS,SS,DS,ES,FS,GS 等段寄存器及其描述项;TR,GDTR,IDTR 寄存器;IA32_SYSENTER_CS,IA32_SYSENTER_ESP,IA32_SYSENTER_EIP 和 IA32_PERF_GLOBAL_CTRL 等 MSR 寄存器。客户机状态区并不包括通用寄存器的内容,VMM 自行决定是否在 VM exit 的时候保存它们,从而提升了系统性能。客户机状态区还包括非物理寄存器的内容,好比一个 32 位的 Active State 值代表 Guest OS 执行时处理器所处的活跃状态,若是正常执行指令就是处于 Active 状态,若是触发了三重故障(Triple Fault)或其它严重错误就处于 Shutdown 状态,等等。函数
前文已经提过,执行控制区用于存放能够操控 VM entry 和 VM exit 的标志位,包括:性能
VMCS 还包括一组位图以提供更好的适应性:优化
每次发生 VM exit时,硬件自动在 VMCS 中存入丰富的信息,方便 VMM 甄别事件的种类和缘由。VM entry 时,VMM 能够方便地为 Guest OS 注入事件(中断和异常),由于 VMCS 中存有 Guest OS 的中断描述表(IDT)的地址,所以硬件可以自动地调用 Guest OS 的处理程序。spa
更详细的信息请参阅 Intel 开发手册 [5]。设计