虚拟 MMU

每个分区公开的虚拟机接口包括一个内存管理单元(MMU)。 虚拟机监控程序分区公开的虚拟 MMU 通常与现有 MMU 兼容。

虚拟 MMU 概述

虚拟处理器公开虚拟内存和虚拟 TLB(翻译旁视缓冲区),用于缓存从虚拟地址到(来宾)物理地址的转换。 与逻辑处理器上的 TLB 一样,虚拟 TLB 是一个不一致的缓存,此不一致性对来宾可见。 虚拟机监控程序公开用于刷新 TLB 的作。 来宾可以使用这些作删除可能不一致的条目,并使虚拟地址转换可预测。

Compatibility

虚拟机监控程序公开的虚拟 MMU 通常与 x64 处理器中找到的物理 MMU 兼容。 存在以下来宾可观察的差异:

  • CR3。PWT 和 CR3。某些虚拟机监控程序实现中可能不支持 PCD 位。 对于此类实现,来宾通过 MOV 将这些标志设置为 CR3 指令或任务门开关的任何尝试都将忽略。 尝试通过 HvSetVpRegisters 或 HvCallSwitchVirtualAddressSpace 以编程方式设置这些位可能会导致错误。
  • 叶页表条目中的 PWT 和 PCD 位(例如,4-K 页的 PTE 和大型页的 PDE)指定所映射页面的可缓存性。 非叶页表项中的 PAT、PWT 和 PCD 位表示层次结构中下一页表的可缓存性。 某些虚拟机监控程序实现可能不支持这些标志。 对于此类实现,虚拟机监控程序执行的所有页表访问都是使用写回缓存属性完成的。 这会影响写入页表条目的访问位和脏位。 如果来宾设置非叶页表条目中的 PAT、PWT 或 PCD 位,则虚拟处理器访问该页表映射的页面时,可能会生成“不支持的功能”消息。
  • 某些虚拟机监控程序实现中可能不支持 CR0.CD(缓存禁用)位。 在此类实现中,CR0.CD 位必须设置为 0。 来宾通过 MOV 设置此标志的任何尝试都将忽略到 CR0 指令。 尝试通过 HvSetVpRegisters 以编程方式设置此位将导致错误。
  • PAT(页面地址类型)MSR 是每 VP 寄存器。 但是,当分区中的所有虚拟处理器将 PAT MSR 设置为相同的值时,新效果将成为分区范围的效果。
  • 出于安全和隔离的原因,INVD 指令将虚拟化为像 WBINVD 指令一样,但存在一些差异。 出于安全考虑,应改用 CLFLUSH。

旧版 TLB 管理作

x64 体系结构提供了多种管理处理器的TLB 的方法。 虚拟机监控程序虚拟化了以下机制:

  • INVLPG 指令使处理器的 TLB 中的单个页面的翻译失效。 如果指定的虚拟地址最初映射为 4-K 页,则会从 TLB 中删除此页面的翻译。 如果指定的虚拟地址最初映射为“大页”(2 MB 或 4 MB,具体取决于 MMU 模式),则会从 TLB 中删除整个大页面的转换。 INVLPG 指令刷新全局翻译和非全局翻译。 全局翻译定义为在页表条目中设置了“global”位的翻译。
  • 修改 CR3 的 MOV 到 CR3 指令和任务开关会使处理器 TLB 中所有非全局页面的翻译失效。
  • 修改 CR4 的 MOV 到 CR4 指令。PGE (全局页面启用)位,CR4。PSE(页面大小扩展)位或 CR4。PAE(页面地址扩展)位会使处理器的 TLB 中的所有翻译(全局和非全局)失效。

请注意,所有这些无效作仅影响一个处理器。 若要使其他处理器上的翻译失效,软件必须使用基于软件的“TLB 射击”机制(通常通过使用进程间中断实现)。

虚拟 TLB 增强功能

除了支持前面所述的旧 TLB 管理机制外,虚拟机监控程序还支持一组增强功能,使来宾能够更有效地管理虚拟 TLB。 这些增强的作可与旧 TLB 管理作互换使用。

虚拟机监控程序支持以下超卡使 TLB 失效:

Hypercall Description
HvCallFlushVirtualAddressSpace 使属于指定地址空间的所有虚拟 TLB 条目失效。
HvCallFlushVirtualAddressSpaceEx 类似于 HvCallFlushVirtualAddressSpace,采用稀疏 VP 集作为输入。
HvCallFlushVirtualAddressList 使指定地址空间的一部分失效。
HvCallFlushVirtualAddressListEx 与 HvCallFlushVirtualAddressList 类似,采用稀疏 VP 集作为输入。

在某些系统上(硬件中有足够的虚拟化支持),旧版 TLB 管理说明对于本地或远程(跨处理器)TLB 失效可能更快。 对最佳性能感兴趣的来宾应使用 CPUID 叶0x40000004来确定使用超卡实现的行为:

  • UseHypercallForAddressSpaceSwitch:如果设置了此标志,调用方应假定使用 HvCallSwitchVirtualAddressSpace 在地址空间之间切换速度更快。 如果此标志明确,建议使用 MOV 到 CR3 指令。
  • UseHypercallForLocalFlush:如果设置了此标志,调用方应假定使用超卡(而不是 INVLPG 或 MOV 到 CR3)更快地刷新虚拟 TLB 中的一个或多个页面。
  • UseHypercallForRemoteFlushAndLocalFlushEntire:如果设置了此标志,调用方应假定使用超卡(而不是使用来宾生成的处理器间中断)更快地刷新虚拟 TLB 中的一个或多个页面。

内存缓存控件概述

虚拟机监控程序支持来宾定义的可缓存性设置,这些页面在来宾的 HTML 空间中映射。 有关可用可缓存性设置及其含义的详细说明,请参阅 Intel 或 AMD 文档。

当虚拟处理器通过其 CDN 空间访问页面时,虚拟机监控程序会遵循用于映射页面的来宾页表条目中的缓存属性位(PAT、PWT 和 PCD)。 这三位用作分区 PAT(页地址类型)寄存器的索引,以查找页面的最终可缓存性设置。

通过 GPA 空间直接访问的页面(例如,禁用分页时,因为清除 CR0.PG)使用 MTR 定义的可缓存性。 如果虚拟机监控程序实现不支持虚拟 MTR,则假定 WB 可缓存性。

在分区和虚拟机监控程序之间混合缓存类型

来宾应注意,虚拟机监控程序可能会访问其 GPA 空间中的某些页面。 以下列表虽然并不详尽,但提供了几个示例:

  • 包含 Hypercall 的输入或输出参数的页面
  • 包括超覆盖页、SynIC SIEF 和 SIM 页以及统计信息页在内的所有覆盖页

虚拟机监控程序始终使用 WB 可缓存性设置执行对超总参数和覆盖页的访问。