虚拟化主机功能是指分区具有 CreatePartitions 分区特权(“HV_PARTITION_PRIVILEGE_MASK”)时创建和管理子分区的能力。
此功能提供全面的分区生命周期管理、内存池管理、地址空间控制和分区间通信。 虚拟化主机维护与托管分区的父子关系,并协调其执行、资源分配和通信。
Windows 兼容性
Hypercall 接口在运行非 Windows作系统时使用。
Windows 应用程序必须使用 Windows 虚拟机监控程序平台 API 来实现虚拟化主机。 这可以保证与其他 Windows 功能(如基于虚拟化的安全性)完全兼容。
术语
以下术语用于定义虚拟化主机关系:
| 术语 | Definition |
|---|---|
| 虚拟化主机 | 具有 CreatePartitions 特权的分区,用于管理子分区。 |
| 父分区 | 已创建和管理一个或多个子分区的分区。 |
| 子分区 | 由另一个分区创建和管理的分区(其父分区)。 |
| 根分区 | 管理裸机主机的分区。 |
| 虚拟处理器(VP) | 运行来宾代码的分区中的执行上下文。 |
| 来宾物理地址 (GPA) | 来宾软件看到的物理内存地址。 |
分区生命周期管理
分区生命周期管理包括子分区的创建、配置、执行和清理。 生命周期遵循一个严格的状态模型,其中定义了状态之间的转换。
分区状态
子分区通过以下状态进行:
| State | Description | 允许的作 |
|---|---|---|
| 已创建 | 分区存在,但无法执行代码 | 配置属性,存储内存 |
| 初始 化 | 配置已验证,已准备好创建 VP | 创建 VP,调整属性* |
| 积极 | 准备好执行,配置已锁定 | 执行来宾代码,运行时管理 |
| 完成 | 清理资源,准备删除 | 提取内存,删除分区 |
| 已删除 | 分区不再存在 |
典型使用模式
基本分区创建
创建子分区的最常见模式遵循以下顺序:
- 调用
HvCallCreatePartition以建立分区 - 调用
HvCallSetPartitionProperty以根据需要为来宾工作负荷配置分区属性 - 调用
HvCallInitializePartition以验证配置并转换为活动状态 - 为每个所需的虚拟处理器调用
HvCallCreateVp - 配置初始 VP 状态(寄存器、内存映射等)
- 通过清除 HvRegisterExplicitSuspend VP 寄存器启动 VP0。 来宾处理启动其余 VP。
分区清理
关闭子分区时:
- 停止所有虚拟处理器执行
- 调用
HvCallFinalizePartition以清理 VP、端口、连接和资源 - 提取剩余分区内存
- 调用
HvCallDeletePartition以销毁分区
内存池管理
虚拟化主机应为虚拟机监控程序提供足够的内存,以允许它代表任何给定分区分配其内部跟踪结构。 虚拟机监控程序为每个分区维护单独的内存池,虚拟化主机使用存款接口为虚拟机监控程序提供内存。
内存作
| Hypercall | Description |
|---|---|
HvCallDepositMemory |
目标分区的存款内存 |
HvCallWithdrawMemory |
从子分区回收内存页 |
HvCallGetMemoryBalance |
查询当前内存分配和使用情况统计信息 |
存储页面时,虚拟化主机将失去对该页面的访问权限。
内存管理模式
初始内存分配
创建子分区时:
- 创建和初始化分区
- 调用
HvCallDepositMemory以提供初始内存分配 - 创建虚拟处理器(可能需要额外的内存)
- 完成分区
分区和 VP 配置
分区和虚拟处理器配置可控制功能、功能、隔离设置和执行环境。 必须在特定的分区状态期间设置配置属性。
分区属性
| Hypercall | Description |
|---|---|
HvCallSetPartitionProperty |
配置分区功能、特性和行为(较小的固定大小值) |
HvCallSetPartitionPropertyEx |
较大可变大小的属性值的扩展变体 |
HvCallGetPartitionProperty |
查询当前分区属性值 |
使用情况说明
- 必须在之前
HvCallInitializePartition设置早期分区属性。 有关详细信息 ,请参阅HV_PARTITION_PROPERTY_CODE 。
虚拟处理器状态管理
| Hypercall | Description |
|---|---|
HvCallGetVpRegisters |
用于读取体系结构寄存器集的 Rep 接口(批处理) |
HvCallSetVpRegisters |
用于编写体系结构寄存器集的 Rep 接口(批处理) |
HvCallGetVpCpuidValues |
查询向 VP 公开的 CPUID 值 |
地址空间管理
地址空间作支持连续映射模式和稀疏映射模式,为各种来宾配置启用高效的内存布局。
内存映射作
| Hypercall | Description |
|---|---|
HvCallMapGpaPages |
将连续 GPA 范围映射到物理地址 |
HvCallMapSparseGpaPages |
使用单个控件映射非连续 GPA 页面 |
HvCallUnmapGpaPages |
删除 GPA 映射和释放资源 |
HvCallModifySparseGpaPages |
修改现有的稀疏 GPA 页面映射 |
内存访问作
| Hypercall | Description |
|---|---|
HvCallTranslateVirtualAddress |
将来宾虚拟地址转换为物理地址 |
HvCallTranslateVirtualAddressEx |
使用其他控件进行扩展来宾地址转换 |
截获和监视
拦截功能使父分区能够监视和控制对各种系统资源的子分区访问,包括 MSR、IO 端口和 CPUID 指令。
| Hypercall | Description |
|---|---|
HvCallInstallIntercept |
安装子分区资源访问截距 |
HvCallInstallInterceptEx |
扩展拦截安装 |
HvCallCheckForIoIntercept |
检查是否应截获 IO 端口访问 |
HvCallRegisterInterceptResult |
为特定拦截类型注册结果处理程序 |
HvCallUnregisterInterceptResult |
删除以前注册的截获结果处理程序 |
功能与特权发现
- 系统范围的可选功能(例如支持的拦截类)通过体系结构定义的 CPUID 叶和其他记录的发现机制进行枚举。
- 每分区特权(CreatePartitions、AccessVpRegisters、StartVirtualProcessor 等)反映在特权掩码属性中。
- 当缺少可选功能时,虚拟化主机应正常降级。
使用情况说明
- 缓存启动生存期的静态功能指示器;避免在热路径中重新查询。
缓存和 TLB 管理
缓存和 TLB 失效作可控制虚拟机的处理器缓存行为。
| Hypercall | Description |
|---|---|
HvCallFlushVirtualAddressSpace |
使来宾 TLB 中的虚拟地址映射失效 |
HvCallFlushVirtualAddressList |
使来宾 TDB 中的特定虚拟地址范围失效 |
统计信息和监视
统计信息和监视提供分区和虚拟处理器性能、资源利用率和作指标的可见性。
统计信息集合
| Hypercall | Description |
|---|---|
HvCallMapStatsPage2 |
用于性能监视的“映射分区统计信息”页 |
HvCallMapVpStatePage |
映射详细指标的虚拟处理器统计信息页 |
HvCallUnmapVpStatePage |
删除 VP 统计信息页映射 |
统计信息页提供实时指标,包括执行时间、中断计数、超聚合统计信息和资源利用率数据。
分区枚举
| Hypercall | Description |
|---|---|
HvCallGetNextChildPartition |
枚举此虚拟化主机管理的子分区 |
虚拟中断管理
虚拟中断管理可控制和协调分区之间的中断传递。
中断作
| Hypercall | Description |
|---|---|
HvCallAssertVirtualInterrupt |
将虚拟中断从父分区传送到子分区 |
虚拟中断资源管理 (ARM64)
| Hypercall | Description |
|---|---|
HvCallSetVirtualInterruptTarget |
为虚拟中断路由配置目标 VP |
端口管理和 Inter-Partition 通信
端口管理为分区之间的结构化通信提供了基础。
端口生命周期作
| Hypercall | Description |
|---|---|
HvCallCreatePort |
创建用于分区间通信的通信端口 |
HvCallDeletePort |
删除端口并释放关联的资源 |
连接管理
| Hypercall | Description |
|---|---|
HvCallConnectPort |
在分区之间建立活动通信通道 |
HvCallDisconnectPort |
在保留端口基础结构时终止连接 |
直接通信作
| Hypercall | Description |
|---|---|
HvCallPostMessageDirect |
将消息直接发布到 VP 消息队列 |