虚拟化主机

虚拟化主机功能是指分区具有 CreatePartitions 分区特权(“HV_PARTITION_PRIVILEGE_MASK”)时创建和管理子分区的能力。

此功能提供全面的分区生命周期管理、内存池管理、地址空间控制和分区间通信。 虚拟化主机维护与托管分区的父子关系,并协调其执行、资源分配和通信。

Windows 兼容性

Hypercall 接口在运行非 Windows作系统时使用。

Windows 应用程序必须使用 Windows 虚拟机监控程序平台 API 来实现虚拟化主机。 这可以保证与其他 Windows 功能(如基于虚拟化的安全性)完全兼容。

术语

以下术语用于定义虚拟化主机关系:

术语 Definition
虚拟化主机 具有 CreatePartitions 特权的分区,用于管理子分区。
父分区 已创建和管理一个或多个子分区的分区。
子分区 由另一个分区创建和管理的分区(其父分区)。
根分区 管理裸机主机的分区。
虚拟处理器(VP) 运行来宾代码的分区中的执行上下文。
来宾物理地址 (GPA) 来宾软件看到的物理内存地址。

分区生命周期管理

分区生命周期管理包括子分区的创建、配置、执行和清理。 生命周期遵循一个严格的状态模型,其中定义了状态之间的转换。

分区状态

子分区通过以下状态进行:

State Description 允许的作
已创建 分区存在,但无法执行代码 配置属性,存储内存
初始 化 配置已验证,已准备好创建 VP 创建 VP,调整属性*
积极 准备好执行,配置已锁定 执行来宾代码,运行时管理
完成 清理资源,准备删除 提取内存,删除分区
已删除 分区不再存在

典型使用模式

基本分区创建

创建子分区的最常见模式遵循以下顺序:

  1. 调用 HvCallCreatePartition 以建立分区
  2. 调用 HvCallSetPartitionProperty 以根据需要为来宾工作负荷配置分区属性
  3. 调用 HvCallInitializePartition 以验证配置并转换为活动状态
  4. 为每个所需的虚拟处理器调用HvCallCreateVp
  5. 配置初始 VP 状态(寄存器、内存映射等)
  6. 通过清除 HvRegisterExplicitSuspend VP 寄存器启动 VP0。 来宾处理启动其余 VP。

分区清理

关闭子分区时:

  1. 停止所有虚拟处理器执行
  2. 调用 HvCallFinalizePartition 以清理 VP、端口、连接和资源
  3. 提取剩余分区内存
  4. 调用 HvCallDeletePartition 以销毁分区

内存池管理

虚拟化主机应为虚拟机监控程序提供足够的内存,以允许它代表任何给定分区分配其内部跟踪结构。 虚拟机监控程序为每个分区维护单独的内存池,虚拟化主机使用存款接口为虚拟机监控程序提供内存。

内存作

Hypercall Description
HvCallDepositMemory 目标分区的存款内存
HvCallWithdrawMemory 从子分区回收内存页
HvCallGetMemoryBalance 查询当前内存分配和使用情况统计信息

存储页面时,虚拟化主机将失去对该页面的访问权限。

内存管理模式

初始内存分配

创建子分区时:

  1. 创建和初始化分区
  2. 调用 HvCallDepositMemory 以提供初始内存分配
  3. 创建虚拟处理器(可能需要额外的内存)
  4. 完成分区

分区和 VP 配置

分区和虚拟处理器配置可控制功能、功能、隔离设置和执行环境。 必须在特定的分区状态期间设置配置属性。

分区属性

Hypercall Description
HvCallSetPartitionProperty 配置分区功能、特性和行为(较小的固定大小值)
HvCallSetPartitionPropertyEx 较大可变大小的属性值的扩展变体
HvCallGetPartitionProperty 查询当前分区属性值

使用情况说明

虚拟处理器状态管理

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 消息队列