- 1. 功能检测的必要性
- 2. 检测是否支持VMX架构
- 3. 通过MSR组检查VMX能力
- 4. 例子 2-1
- 5. 基本信息检测
- 6. 允许为 0 以及允许为 1 位
- 7. VM-execution 控制字段
- 8. VM-exit control 字段
- 9. VM-entry control 字段
- 10. VM-function control 字段
- 11. CR0 与 CR4 的固定位
- 12. VMX 杂项信息
- 13. VMCS 区域字段 index 值
- 14. VPID 与 EPT 能力
1. 功能检测的必要性
VMX架构中的很多功能在不同处理器架构有不同的支持, 比如之前提的 VMX-preemption timer 功能.
因此, VMM 需要检测当前VMX架构下的功能, 并进行相应设置.
注: 本书主要参照Intel开发者手册 2012年8月版, order number为: 325462-044US.
2. 检测是否支持VMX架构
VMX 架构是否支持, 使用 CPUID.01H:ECX.VMX[5]位来进行检测(详细见2.2.3)
3. 通过MSR组检查VMX能力
VMX 架构提供了众多项目能力的检测, 包括: VMX的基本信息、杂项信息、VPID与EPT能力, 还有对VMCS内的control fields(控制字段)允许设置的位. 控制字段的位允许被置为1时, 代表着处理器拥有这个能力.
比如, secondary processor-based control字段的bit 7是"Unrestricted guest"位, 当它允许被置为1时, 表明处理器支持 unrestricted guest(不受限制的guest端)功能. 反之, 则表明处理器不支持该功能.
VMX 的这些能力的检测提供在几组共 14 个 MSR(Model Specific Register)里, 如表2-1, 除了这些, 还有 4 个扩展的 TRUE 系列寄存器, 详见2.5.4节和2.5.5节
......
4. 例子 2-1
5. 基本信息检测
IA32_VMX_BASIC寄存器用来检测 VMX 的基本能力信息, 如图 2-6 所示.
... ...
bit 55 位为 1 时, 表示支持 4 个 TRUE 寄存器, 这 4 个 TRUE 寄存器将影响最终的 VMCS 中的某些控制位, 如表 2-2 .
bit 55 的值决定由谁来控制这些 VMCS 字段固定位的设置. 当 bit 55 为 0 时, 这些 VMCS 字段的
6. 允许为 0 以及允许为 1 位
6.1. 决定 VMX 支持的功能
6.2. 控制字段设置算法
7. VM-execution 控制字段
在 VMCS 区域的三个 VM-execution control 字段需要检查 VMX 能力寄存器来确认 default0 与 default1 位. 如下所示:
7.1. Pin-based VM-execution control 字段
7.2. primary processor-based VM-execution control 字段
7.3. secondary processor-based VM-execution control 字段
8. VM-exit control 字段
9. VM-entry control 字段
10. VM-function control 字段
11. CR0 与 CR4 的固定位
11.1. CR0 与 CR4 寄存器设置算法
12. VMX 杂项信息
13. VMCS 区域字段 index 值
14. VPID 与 EPT 能力
IA32_VMX_EPT_VPID_CAP寄存器提供两方面的能力检测, 包括 EPT(扩展页表)所支持的能力, 以及 EPT 页面 cache( TLBs 及 paging-structure cache )的能力.
当下面的条件满足时, 才支持 IA32_VMX_EPT_VPID_CAP 寄存器.
(1) CPUID.01H:ECX[5]=1, 表明支持 VMX 架构.
(2) IA32_VMX_PROCBASED_CTLS[63]=1, 表明支持 IA32_VMX_PROCBASED_CTLS2 寄存器.
(3) IA32_VMX_PROCBASED_CTLS2[33]=1, 表明支持 "enable EPT" 位.
如图 2-11 是 IA32_VMX_EPT_VPID_CAP寄存器的结构.
对于 EPT 能力, bit 0 为 1 时, 允许在 EPT 页表表项里的 bits 2:0 使用 100b(execute-only页)属性. bit 6为 1 时, 表明支持 4 级页表结构. bit 16为1时支持使用 2M 页, bit 17为1时支持使用 1G 页. 最后, bit 21 为 1 时支持在页表项里使用 dirty 标志.
bit 8为 1 时, 允许在 EPTP 字段的 bits 2:0 里设为UC类型(值为0), 而bit 14为1时, 允许在 EPTP 的bits 2:0 里设置为WB类型(值为6). 见4.4.1.3
对于 EPT cache的能力, bit 20 为 1 时支持INVEPT指令, bit 32为 1 时支持INVVPID指令. INVEPT指令支持的刷新类型由 bit 25 和 bit 26 检测. bit 25为1时, 支持 single-context 刷新类型, bit 26为 1时, 支持all-context刷新类型.
INVVPID指令支持的刷新类型由bits 43:40检测. bit 40为1时, 支持 individual-address 类型(type值为0). bit 41为1时, 支持single-context类型(type值为1). bit 42为1时, 支持 all-context类型(type值为2). bit 43为1时, 支持single-context-retaining-globals类型(type值为3).