对于Intel x86处理器,在打开VMX(Virtual Machine Extension),即执行VMXON指令的时候需要提供一个4KB对齐的内存区间,称作VMXON region,该区域的物理地址作为VMXON指令的操作数。该内存区间用于支持逻辑CPU的VMX功能,该区域在VMXON和VMXOFF之间一直都会被VMX硬体所使用。

VMXON Region内存区域的要求跟VMCS类似,也是需要4KB对齐,并且在使用之前,需要先初始化一下VMCS revision,即从IA32_VMX_BASIC MSR寄存器中获取到的31bit的VMCS revision identifier。对于每个支持VMX功能的逻辑CPU而言,都需要一个相应的VMXON Region。

对于软体而言,除了在执行VMXON之前初始化一下VMCS的版本号之外,不需要再做其他事情,特别是在VMXON和VMXOFF之间,软体不应该访问,甚至是更改VMXON Region这段内存,否则可能会造成不可预知的后果。

在KVM模块中,KVM的模块载入过程vmx_init()中,会调用到alloc_kvm_area()函数,为每个逻辑CPU分配一个VMXON Region。

源码中,分配VMXON Region的时候完全是以分配VMCS的方式进行分配的,这个可能容易让人将VMXON Region和VMCS Region混起来。

注意:VMXON Region和VMCS Region是不一样的两个内存区域,VMXON是针对逻辑CPU的,每个逻辑CPU都会有一份,并且在整个VMX功能使用期间硬体都会使用;而VMCS Region则是针对vCPU的,每个vCPU都会有一份VMCS Region,用于辅助硬体对vCPU的模拟。

VMXON Region看样子完全是为了满足VMX功能在硬体上的需求,里面具体有什么数据,Intel并没有公开,软体要做的就是分配一个这样的数据区,标明VMCS revision,让后扔该硬体自个儿玩去,VMM没有必要也没有资格管。

推荐阅读:

相关文章