Intel VMM简介

Intel提供了处理器级的VMX(Virtual-Machine Extensions),从硬件层面支持VT技术。本文及后续的几篇文章将结合"Intel 64 and IA-32 Architectures Software developer's Manual (Volume 3B)"和自己使用Xen的经验写些东西,算是学习笔记吧,不足之处在所难免,哪位看到了希望能共同交流提高 (^_^)。

先看一下虚拟机的体系结构:Intel VMX的体系结构可划分为两层:VMM和VM。

  • VMM(Virtual-Machine Monitors)作为host,具有对processor(s)和平台硬件的完全控制权限。它为guest提供VCPU(virtual processor)的抽象,并允许guest直接运行在逻辑处理器(logical processor)上。VMM具有对处理器资源、物理内存、中断和IO的选择控制的权利。(举例:Xen就是一种VMM。)
  • VM(Virtual-Machine)相应地作为guest,其实是提供了一种guest软件环境:它维护一个栈,其中包含了OS和application software。其每个操作都独立于其他的VM,并且使用由同一个物理平台所提供的对处理器、内存、硬盘、显卡、IO访问的统一接口。此外,这个栈并不知道VMM的存在。运行于VM中的软件其权限是受限的,这样才能保障VMM对整个平台资源的完全控制。(举相应的例子:Xen上跑的Guest OS就是VM。)

下面来简要介绍一下 VMX operation 。支持虚拟化的处理器其虚拟化相关的操作被称为VMX operation 。它分为两类:VMX root operation 和 VMX non-root operation 。通常来说,VMM 运行于 VMX root operation 而 guest 运行于 VMX non-root operation 。两种operation之间的转换被称为VMX transitions:从root到non-root被称为VM entries,而从non-root到root则称为VM exits。简单可如下图所示:
处于VMX root operation的CPU其行为与在VMX operation之外是基本一样的,最根本的不同之处在于其增加了一套新的VMX指令集,且能存储到特定控制寄存器的值是有限的。而处于VMX non-root operation的CPU起行为是受限的,且经过了修改以帮助实现virtualization。与其普通的operation不同,特定的指令(包括新增的VMCALL指令)和事件将导致VM exits从而进入VMM:由于这些VM exits代替了以前正常的行为,所以在VMX non-root operation中的软件的功能是受限的(也正是这种限制保证了VMM能够始终具有控制处理器资源的能力)。

从guest的角度,没有任何一个Guest可见的位来指示一个逻辑处理器是否处于VMX non-root operation,这样VMX就能保证guest并不知道其正在运行于一个VM中。即便是CPL(current privilege level)为0,VMX operation也给guest加了限制,这样guest software就可以完全不必改变其原始的设计,这也简化了VMM的开发。

现在就可以看一下VMM与Guest之间的交互了。大体的流程是这样子的:
  1. software执行VMXON指令进入VMX operation
  2. 通过VM entries,VMM就可以进入VM的guest中(VMM通过VMLANCH和VMRESUME来触发VM entry,并通过VM exits重新获得控制权)
  3. VM exits将控制权转移到由VMM定义的entry point(VMM可以采取适当的动作来触发VM exit,然后再使用一个VM entry就可以返回到VM中)。
  4. 最后,VMM通过VMXOFF指令关闭自身并退出VMX operation

既然已经涉及到VMX指令,下面又引出一个非常重要的数据结构VMCS(Virtual-Machine Control Structure),这个数据结构在下文中还要非常详细地介绍。对VMCS的访问是由一组被称作VMCS pointer(每个logical processor有一个VMCS pointer)的处理器状态来管理的。VMCS pointer是一个64位的VMCS地址,可通过VMPTRST和VMPTRLD指令对其进行读写;VMM可以使用VMREAD、VMWRITE、VMCLEAR指令对VMCS进行配置。对VMM所管理的每个VM,VMM可以使用不同的VMCS;且对VM中的每个logical processor(or vcpu),VMM也可以为每个vcpu使用不同的VMCS。

VMX operation需要处理器支持,那么如何从软件层面断定一个处理器是否支持VMX operation:通过CPUID --- 如果CPUID.1:ECX.VMX[bit 5] = 1,那说明该CPU支持VMX operation。现有的VMX体系结构的设计具有良好的可扩展性,software可以使用一个VMX capability MSRs集来获得VMX新增的扩展特性。

现在再来看看如何使能和进入VMX operation:进入VMX operation之前,system software通过设置CR4.VMXE[bit 13] = 1 来使能VMX,之后就可以通过VMXON指令来进入VMX operation。如果CR4.VMXE = 0,VMXON将导致一个invalid-opcode异常(#UD),而且一旦进入VMX operation,CR4.VMXE就无法在此中被清零;system software通过VMXOFF离开VMX operation,只有在VMX operation外部CR4.VMXE才能被清零。

VMXON由IA32_FEATURE_CONTROL MSR (MSR address 3AH)所控制,当一个logical processor被rest时,该MSR被清零。此MSR的相关位如下:
  • Bit 0 is the lock bit. 若该位被清零,VMXON就会触发一个general-protection exception;若该位被置1,向此MSR进行WRMSR也会触发general-protection exception,直到a power up reset condition发生时该MSR才能被修改。系统BIOS可以通过该比特位来禁用VMX,若要打开VMX支持,BIOS必须设置该MSR的bit 0, bit 1, bit 2。
  • Bit 1 enables VMXON in SMX operation. 若该位被清零,SMX operation中的VMXON将触发一个general-protection exception。若在不同时支持VMX和SMX的logical processors上试图设置该位,将会触发general-protection exceptions。(若一个logical processor自从最后一次执行GETSEC[SENTER]为止GETSEC[SEXIT]还未被执行,则称其in SMX operation)
  • Bit 2 enables VMXON outside SMX operation. 若该位被清零,在SMX operation外部进行VMXON将触发一个general-protection exception。在不支持VMX的logical processors上试图设置该位将触发general-protection exceptions。(若一个logical processor还未执行GETSEC[SENTER]或最后一次执行过GETSEC[SENTER]后又执行了GETSEC[SEXIT],则称其outside SMX operation)
在执行VMXON之前,software应该分配出(保留)一块4KB对齐的内存区域供logical processor用以支持VMX operation。这个内存区域就被称为VMXON region。

最后,简单说说VMX operation上的限制:VMX operation对processor operation作了一些限制,诸如,
  • 在VMX operation中,处理器将对CR0和CR4的某些具体位填充固定值(CR0.PE, CR0.NE, CR0.PG, cR4.VMXE的值都必须为1)。如果这些位中任何一位的值并不是它应该的值,VMXON就会fail。在VMX operation中任何试图使用CLTS, LMSW, MOV CR等指令改变这些位的值都将导致general-protection exception。VM entry或VM exit都无法将这些位的值设置为其不应该的值。(CR0.PE和CR0.PG的限制就说明了VMX operation必须处于paged protected mode,这也使得guest software无法运行于unpaged protected mode或real-address mode中)
  • 若logical processor处于A20M mode,VMXON会fail。一旦处理器进入VMX operation, A20M的中断就会被block,这样VMX operation中A20M mode当然是不可能的了。
  • 只要logical processor处于VMX root operation,INIT signal就会被block;在VMX non-root operation中它是不会被block的,此时INITs将触发VM exits。

从源码级别,Xen里面的 vmx.c 描述的就是Intel VMX体系结构相关的VM Exits支持:对照着Intel的Manual可以找到Xen对其的具体实现。

你可能感兴趣的:(Intel VMM简介)