在虚拟化中,为了实现vCPU,既要模拟CPU的运行,又要记录vCPU的状态(包括对vCPU运行的控制信息),在Intel x86处理器的VMX(Virtual Machine Extension)功能中,通过引入根运行模式(VMX root operation)和非根模式(VMX non-root operation),直接让vCPU运行在逻辑CPU上,在软体上省去了对vCPU运行的模拟,同时也大大提升了性能。剩下的就是对vCPU状态的记录了,为此Intel引入了VMCS(Virtual Machine Control Structure)功能。
VMCS(Virtual Machine Control Structure)是Intel x86处理器中实现CPU虚拟化,记录vCPU状态的一个关键数据结构。该数据结构主要包含如下六方面的信息:
- Guest-state area,即vCPU的状态信息,包括vCPU的基本运行环境(如通用寄存器等)和一些非寄存器信息,如当前vCPU是否接收中断,是否有挂起的exception,VMCS的状态等等。
- Host-state area,即主机物理CPU的状态信息,因为物理CPU是在主机CPU和vCPU之间来回切换运行的,所以在VMCS中既要记录vCPU的状态,也需要记录主机CPU的状态,这样vCPU才能有足够的信息恢复到原来主机CPU的状态,继续主机CPU的运行。其包含的具体信息和前面记录的vCPU的状态信息大体相同。
- VM-execution control fields,该方面信息主要用于对vCPU的运行行为进行控制,这是VMM对vCPU进行配置最复杂的一部分,如
- 控制vCPU在接收到某些中断事件的时候,是否直接在vCPU中处理掉,即虚拟机直接处理掉该中断事件还是需要退出到VMM中,让VMM去处理该中断事件。
- 是否使用EPT(Extended Page Table)功能。
- 是否允许vCPU直接访问某些I/O口,MSR寄存器等资源。
- vCPU执行某些指令的时候,是否会出发VM Exit等等。
- VM-exit control fields,即对VM Exit的行为进行控制,如VM Exit的时候对vCPU来说需要保存哪些MSR寄存器,对于主机CPU来说需要恢复哪些MSR寄存器。
- VM-entry control fields,即对VM Entry的行为进行控制,如需要保存和恢复哪些MSR寄存器,是否需要向vCPU注入中断和异常等事件(VM Exit的时候不需要向主机CPU注入中断/异常事件,因为可以让那些事件直接触发VM Exit)。
- VM-exit information fields,即记录下发生VM Exit发生的原因及一些必要的信息,方便于VMM对VM Exit事件进行处理,如vCPU访问了特权资源造成VM Exit,则在该区域中,会记录下这个特权资源的类型,如I/O地址,内存地址或者是MSR寄存器,并且也会记录下该特权资源的地址,好让VMM对该特权资源进行模拟。
VMCS有点类似于Linux进程中的上下问,只是它保存的是vCPU/CPU的状态和控制信息,而不是进程/线程的状态和控制信息。
每个vCPU都有自己的一份VMCS数据结构,并且在同一个VM中的vCPU可能会通过VMCS中的指针共享一些数据,如I/O bitmap,MSR bitmap和EPT表等。VMCS的大小需要查看VMX capability MSR IA32_VMX_BASIC寄存器来决定,不同的处理器可能要求的不一样,最大不超过4KB。
每个VMCS都会有一个8位元组的头部,前面4位元组主要用来表示VMCS的版本号并且表示VMCS是否为shadow VMCS。然后从偏移量8开始,就是VMCS的数据区,不同版本号的VMCS数据区分布会不一样。