虚拟 MMU

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

虚拟 MMU 概述

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

兼容性

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

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

旧 TLB 管理操作

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

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

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

虚拟 TLB 增强功能

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

虚拟机监控程序支持以下超调用来使 TRB 失效:

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

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

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

内存缓存控件概述

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

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

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

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

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

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

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