特性和接口发现
来宾软件通过各种机制与虚拟机监控程序交互。 其中许多机制都反映了软件用来与基础处理器交互的传统机制。 因此,这些机制特定于体系结构。 在 x64 体系结构上,使用了以下机制:
- CPUID 指令 – 用于静态特性和版本信息。
- MSR (特定于模型的寄存器) – 用于状态和控制值。
- 内存映射寄存器 – 用于状态和控制值。
- 处理器中断 – 用于异步事件、通知和消息。
除了这些特定于体系结构的接口,虚拟机监控程序还提供使用超大规模实现的简单 过程接口。
虚拟机监控程序发现
在使用任何虚拟机监控程序接口之前,软件应首先确定它是否在虚拟化环境中运行。 在符合此规范的 x64 平台上,这是通过执行 CPUID 指令和输入 EAX (1) 的。 执行时,代码应检查寄存器 ECX 的位 31 ("虚拟机监控程序存在位") 。 如果设置了此位,则存在虚拟机监控程序。 在非虚拟化环境中,位将清晰。
CPUID.01h.ECX:31 // if set, virtualization present
如果设置了"虚拟机监控程序存在位",可以查询其他 CPUID 叶,了解有关符合标准的虚拟机监控程序及其功能的信息。 保证有两个这样的叶可用: 和 0x40000000
0x40000001
。 后续编号的叶可能也可用。
标准虚拟机监控程序 CPUID 叶
查询 中的 0x40000000
叶时,虚拟机监控程序将返回提供最大虚拟机监控程序 CPUID 叶数和供应商 ID 签名的信息。
注册 | 提供的信息 |
---|---|
EAX | 虚拟机监控程序 CPUID 信息的最大输入值 |
EBX | 虚拟机监控程序供应商 ID 签名 |
ECX | 虚拟机监控程序供应商 ID 签名 |
EDX | 虚拟机监控程序供应商 ID 签名 |
如果查询 的叶 0x40000001
,它将返回一个值,该值表示与供应商无关的虚拟机监控程序接口标识。 这决定了从 到 的叶的 0x4000002
语义 0x400000FF
。
注册 | 提供的信息 |
---|---|
EAX | 虚拟机监控程序接口签名。 |
EBX | 保留 |
ECX | 保留 |
EDX | 保留 |
这两个叶允许来宾独立查询虚拟机监控程序供应商 ID 和接口。 提供供应商 ID 仅用于信息和诊断目的。 建议软件仅基于通过叶 报告的接口签名做出兼容性决策 0x40000001
。
Microsoft 虚拟机监控程序 CPUID 叶
在符合 Microsoft 虚拟机监控程序 CPUID 接口的虚拟机监控程序上, 0x40000000
0x40000001
和叶寄存器将具有以下值。
虚拟机监控程序 CPUID 叶范围 - 0x40000000
EAX 确定最大虚拟机监控程序 CPUID 叶数。 EBX-EDX 包含虚拟机监控程序供应商 ID 签名。 供应商 ID 签名应仅用于报告和诊断目的。
注册 | 提供的信息 |
---|---|
EAX | 虚拟机监控程序 CPUID 信息的最大输入值。 在 Microsoft 虚拟机监控程序上,这至少为 0x40000005 。 |
EBX | 0x7263694D — "Micr" |
ECX | 0x666F736F — "osof" |
EDX | 0x76482074 -"t Hv" |
虚拟机监控程序供应商非特定接口标识 - 0x40000001
EAX 包含虚拟机监控程序接口标识签名。 这决定了从 到 的叶的 0x40000002
语义 0x400000FF
。
注册 | 提供的信息 |
---|---|
EAX | 0x31237648 — "Hv#1" |
EBX | 保留 |
ECX | 保留 |
EDX | 保留 |
符合"Hv#1"接口的虚拟机监控程序也至少提供以下叶。
虚拟机监控程序系统标识 - 0x40000002
注册 | Bits | 提供的信息 |
---|---|---|
EAX | 生成号 | |
EBX | 31-16 | 主要版本 |
15-0 | 次要版本 |
虚拟机监控程序功能标识 - 0x40000003
EAX 和 EBX 根据当前分区权限指示分区可用的功能。
注册 | Bits | 提供的信息 |
---|---|---|
EAX | 对应于第 31-0 位HV_PARTITION_PRIVILEGE_MASK | |
EBX | 对应于第 63-32 位HV_PARTITION_PRIVILEGE_MASK | |
ECX | 保留 | |
EDX | 0 | 已弃 (之前指示 MWAIT 指令可用性) |
1 | 来宾调试支持可用 | |
2 | 性能监视器支持 | |
3 | 提供对物理 CPU 动态分区事件的支持 | |
4 | 支持通过 XMM 寄存器传递 hypercall 输入参数块 | |
5 | 提供对虚拟来宾空闲状态的支持 | |
6 | 提供虚拟机监控程序睡眠状态支持 | |
7 | 支持查询 NUMA 距离 | |
8 | 支持确定计时器频率 | |
9 | 支持注入合成计算机检查 | |
10 | 提供对来宾故障 MSR 的支持 | |
11 | 支持调试 MSR | |
12 | 提供对 NPIEP 的支持 | |
13 | DisableHypervisorAvailable | |
14 | ExtendedGvaRangesForFlushVirtualAddressListAvailable | |
15 | 支持通过 XMM 寄存器返回 hypercall 输出 | |
16 | 保留 | |
17 | SintPollingModeAvailable | |
18 | HypercallMsrLockAvailable | |
19 | 使用直接综合计时器 | |
20 | 支持适用于 VSM 的 PAT 寄存器 | |
21 | 支持适用于 VSM 的 bndcfgs 寄存器 | |
22 | 保留 | |
23 | 提供对综合时间未触发计时器的支持 | |
25-24 | 保留 | |
26 | 支持 Intel 的 Last Branch Record (LBR) 功能 | |
31-27 | 保留 |
实现推荐 - 0x40000004
指示虚拟机监控程序建议 OS 实现哪些行为以获得最佳性能。
注册 | Bits | 提供的信息 |
---|---|---|
EAX | 0 | 建议对地址空间开关使用 hypercall,而不是使用 MOV 到 CR3 指令。 |
1 | 建议使用 hypercall 进行本地 TLB 刷新,而不是使用 INVLPG 或 MOV 到 CR3 的说明。 | |
2 | 建议使用 hypercall 进行远程 TLB 刷新,而不是处理器间中断。 | |
3 | 建议使用 MSR 来访问 APIC 寄存器 EOI、ICR 和 TPR,而不是其内存映射的对应项。 | |
4 | 建议使用虚拟机监控程序提供的 MSR 启动系统重置。 | |
5 | 建议对此分区使用宽松计时。 如果使用,VM 应禁用依赖于及时传递外部中断的任何监视器超时。 | |
6 | 建议使用 DMA 重新映射。 | |
7 | 建议使用中断重新映射。 | |
8 | 保留。 | |
9 | 建议弃用 AutoEOI。 | |
10 | 建议使用 SyntheticClusterIpi hypercall。 | |
11 | 建议使用较新的 ExProcessorMasks 接口。 | |
12 | 指示虚拟机监控程序嵌套在 Hyper-V 分区中。 | |
13 | 建议使用 INT 进行 MBEC 系统调用。 | |
14 | 建议使用启用的 VMCS 接口的嵌套虚拟机监控程序。 还指示可以在查看叶类 (其他嵌套0x4000000A) 。 | |
15 | UseSyncedTimeline – 指示分区应使用根分区提供的 QueryPerformanceCounter 偏差。 | |
16 | 保留 | |
17 | UseDirectLocalFlushEntire – 指示来宾应切换 CR4。PGE 可刷新整个 TLB,因为与创建超大规模功能更具有性能。 | |
18 | NoNonArchitecturalCoreSharing - 指示无法进行核心共享。 这可用作优化,以避免 STIBP 的性能开销。 | |
31-19 | 保留 | |
EBX | 建议在通知虚拟机监控程序有关故障之前重试旋转锁故障的尝试次数。 0xFFFFFFFF指示从不通知。 | |
ECX | 6-0 | Implemented PhysicalalAddressBits - 报告系统物理处理器 (MAXPHYADDR) 物理地址宽度。 如果所有位都包含 0,则不支持该功能。 请注意,报告的值是物理地址位的实际数目,而不是用于表示该数字的位位置。 |
31-7 | 保留 | |
EDX | 保留 |
虚拟机监控程序实现限制 - 0x40000005
描述当前虚拟机监控程序实现中支持的规模限制。 如果任何值为零,则虚拟机监控程序不会公开相应的信息;否则,它们具有这些含义。
注册 | 提供的信息 |
---|---|
EAX | 支持的最大虚拟处理器数 |
EBX | 支持的最大逻辑处理器数 |
ECX | 可用于中断重新映射的最大物理中断向量数。 |
EDX | 保留 |
实现硬件功能 - 0x40000006
指示已检测到哪些硬件特定的功能,并且虚拟机监控程序当前正在使用这些功能。
注册 | Bits | 提供的信息 |
---|---|---|
EAX | 0 | 检测到 APIC 覆盖辅助支持并使用它。 |
1 | 检测到并使用了对 MSR 位图的支持。 | |
2 | 检测到并使用了对体系结构性能计数器的支持。 | |
3 | 检测到并使用了对二级地址转换的支持。 | |
4 | 检测到 DMA 重新映射的支持,并且该支持正在使用中。 | |
5 | 检测到并使用了中断重新映射支持。 | |
6 | 指示硬件中存在内存清理器。 | |
7 | DMA 保护已使用。 | |
8 | 请求 HPET。 | |
9 | 合成计时器是可变的。 | |
13-10 | 当前来宾的虚拟机监控程序级别 - "0"(如果非嵌套)。 | |
14 | 需要物理目标模式。 | |
15 | 保留 | |
16 | 支持硬件内存归零。 | |
17 | 提供对 Unrestricted Guest 的支持。 | |
18 | 提供对 RDT-A (PQOS-A) 资源分配的支持。 | |
19 | 支持 RDT-M (PQOS-M) 资源监视。 | |
20 | 提供对来宾虚拟 PMU 的支持。 | |
21 | 提供对来宾虚拟 LBR 的支持。 | |
22 | 提供对来宾虚拟 IPT 的支持。 | |
23 | 支持 APIC 仿真。 | |
24 | 虚拟机监控程序检测到并使用 ACPI WDAT 表。 | |
31-25 | 保留 | |
EBX | 保留 | |
ECX | 保留 | |
EDX | 保留 |
嵌套虚拟机监控程序功能标识 - 0x40000009
描述运行嵌套时虚拟机监控程序向分区公开的功能。 EAX 描述对虚拟 MSR 的访问。 EDX 描述对 hypercalls 的访问。
注册 | Bits | 提供的信息 |
---|---|---|
EAX | 1-0 | 保留 |
2 | AccessSynicRegs | |
3 | 保留 | |
4 | AccessIntrCtrlRegs | |
5 | AccessHypercallMsrs | |
6 | AccessVpIndex | |
11-7 | 保留 | |
12 | AccessReenlightenmentControls | |
31-13 | 保留 | |
EBX | 保留 | |
ECX | 保留 | |
EDX | 3-0 | 保留 |
4 | XmmRegistersForFastHypercallAvailable | |
14-5 | 保留 | |
15 | FastHypercallOutputAvailable | |
16 | 保留 | |
17 | SintPollingModeAvailable | |
31-18 | 保留 |
虚拟机监控程序嵌套虚拟化功能 - 0x4000000A
指示嵌套虚拟机监控程序可以使用哪些嵌套虚拟化优化。
注册 | Bits | 提供的信息 |
---|---|---|
EAX | 7-0 | 启用的 VMCS (低) |
15-8 | 启用的 VMCS (高) | |
16 | 保留 | |
17 | 指示支持直接虚拟刷新 hypercalls。 | |
18 | 指示支持 Intel 平台上的 HvFlushGuestPhysicalAddressSpace 和 HvFlushGuestPhysicalAddressList (hypercalls) 。 | |
19 | 指示支持使用启用的 MSR 位图。 | |
20 | 指示支持在页面错误异常类中合并虚拟化异常。 | |
21 | 保留 | |
22 | 指示对 AMD 平台上启用的 TLB 的支持。 ASID 刷新不会影响派生自一个服务类的 TLB 条目。 Hypercalls 必须用于使"为"的"为""TLB 条目无效。 还指示支持 HvFlushGuestPhysicalAddressSpace 和 HvFlushGuestPhysicalAddressList hypercalls。 | |
31-21 | 保留 | |
EBX | 保留 | |
ECX | 保留 | |
EDX | 保留 |
版本控制
虚拟机监控程序版本信息在叶 中编码 0x40000002
。 提供了两个版本号:主版本和服务版本。
主版本包括主版本号和次版本号以及内部版本号。 这些与 Microsoft Windows版本号相对应。 服务版本描述对主版本所做的更改。
强烈建议客户端通过使用 CPUID 0x40000003
0x40000005
保留来检查虚拟机监控程序功能,而不是与版本范围进行比较。