65.9K
CodeProject 正在变化。 阅读更多。
Home

Hyper-V 和硬件辅助虚拟化

2023年5月7日

CPOL

5分钟阅读

viewsIcon

3499

Hyper-V & 硬件辅助虚拟化

在我使用 Virtual Box 在 Windows 8 上运行虚拟机进行实验时,我注意到“系统”设置中的“加速”选项卡是灰显的。

快速搜索一下 Google 发现,这只会在主机处理器不支持 硬件辅助虚拟化 时发生。对我来说,这显然不是事实,因为我使用的是 late-2012 的 Mac Mini,配备 Intel Core-i5 3210M CPU,支持 VT-x 指令。但是,我使用 Intel Processor Identification UtilityCPU-Z 1.66SecurAble 进行了验证,所有工具都返回了相同令人失望的结果。

我重启了我的机器,该机器设置为三启动 Mac OS、Windows 和 Ubuntu Linux,然后启动到 Mac OS 并运行 MacCPUID。出乎意料的是,该工具报告的结果完全相反——我的 CPU 似乎支持 VT-x 指令: 

那么哪个工具说的是实话呢?我确切知道的一点是,我的机器可以很好地运行 Windows Phone 8 模拟器。由于此模拟器使用 Hyper-V,而 Hyper-V 要求 CPU 支持硬件虚拟化(可能还有 SLAT),所以我的 CPU 必须完全支持虚拟化。

在尝试解决此问题的最后一次尝试中,我通过执行以下操作并重启关闭了 Hyper-V。

bcdedit /set hypervisorlaunchtype off

您猜怎么着,重启后,所有工具都报告说我的 CPU 支持虚拟化。

使用以下命令启用 Hyper-V。

bcdedit /set hypervisorlaunchtype auto

重启后,CPU 似乎再次不支持虚拟化!某些东西,可能是 Hyper-V 加载的驱动程序,掩盖了某些信息,阻止了这些工具检测到 CPU 支持虚拟化。

模型特定寄存器 (MSR)

一些研究表明,可以通过写入位于地址 0x3A 的模型特定寄存器 (MSR) 来启用或禁用虚拟化支持。此 MSR 包含以下三个位:

  • 位 0:锁定位
  • 位 1:在 SMX 模式下激活 VMXON
  • 位 2:在 SMX 模式外激活 VMXON

根据这个网站,BIOS/EFI 必须设置位 1 和位 2,或者所有三个位(包括位 0),这样 VT-x 支持才能被启用。在我的机器上使用 Ubuntu 12.04,安装 msr-tools 包并执行以下命令。

rdmsr 0x3a

返回 5,表示虚拟化已启用。值为 0 或 1 表示虚拟化已禁用,在这种情况下,如果未被锁定(未设置位 0),可以使用 wrmsr 命令启用它。

我猜想 Hyper-V 附带的驱动程序向此 MSR 写入了一个值以禁用硬件虚拟化。由于 Hyper-V 已经知道机器支持虚拟化,因此它仍然会继续使用该功能。但是,其他工具只是读取 CPU 的报告,并抱怨不支持虚拟化。某些软件,如 VMware,将自动尝试启用虚拟化,并在功能未被机器固件锁定(并且对于旧版本的 VMware,如果 .vmx 文件中的 hv.enableIfUnlocked 参数设置为 TRUE)的情况下使用它。

可能的解决方法

知道了问题的根源,我继续寻找在 Windows 上读/写 MSR 的工具,以将值改回 5 并启用虚拟化。不幸的是,这类工具很难找到,因为在 Windows 上,MSR 的访问仅限于 ring 0(内核模式驱动程序)。我找到了以下两个应用程序——但它们都工作得不太好。

  • Performance Inspector:一组各种性能检查工具。其中一个是 MSR ,它支持对模型特定寄存器进行读/写。不幸的是,此工具无法在 Windows 8 上安装。尝试将其兼容模式设置为 Windows 7 可以安装该工具,但驱动程序 perfdd-win7.sys 因错误“请求不受支持”而无法加载。不过,这可能与 32 位/64 位兼容性问题有关。
  • RW-Everything: 此工具似乎支持对 MSR 进行读/写。然而,在我可用的 MSR 列表中,我找不到 MSR 寄存器 0x3A 进行编辑。

除非我能找到另一个工具,否则唯一可行的方法是开发自己的 Windows 工具来读/写 MSR。这将意味着下载 Windows Driver Kit 并花费无数小时开发一个内核模式驱动程序和一个利用该驱动程序的应用程序。然后,该驱动程序可以使用 __readmsr__writemsr 方法访问 MSR 值并设置所需的值。显然,我不会尝试这样做——工作量太大,价值太小!在需要虚拟化时仅禁用 Hyper-V 就足以满足我了。

Mac 系统上的硬件虚拟化

顺便说一下,硬件虚拟化未默认启用的问题似乎是早期 Mac Mini 型号的一个问题。当这种情况发生时,您需要使用 rEFIt 来执行一个 自定义 EFI 应用程序 来启用该功能。在我知道问题是由于 Hyper-V 之前,我尝试在我的 Mac Mini 上这样做,但收到了错误“此 X64 shell 不支持 IA32 图像类型”,因为 EFI 应用程序是为 32 位 Mac 构建的,而我的机器拥有 64 位 EFI,就像大多数较新一代的 Mac 一样。

在其他 Mac 机器上,硬件虚拟化可能默认是禁用的,只能通过让机器休眠几秒钟然后恢复来启用。在多启动 Mac 系统上,如果硬件虚拟化在 Mac 上似乎已启用但在 Windows 上未启用,请尝试启动一个使用虚拟化的 Mac 软件(如 Parallels),然后立即重启到 Windows,而不关闭它。根据这篇文章,此解决方法将允许 Windows 检测到硬件虚拟化已启用并使用它。所有这些问题可能都归因于 Mac 的 EFI 启动过程中一些未能设置某些必需 MSR 位时的错误。

幸运的是,我的机器没有这些问题,硬件虚拟化始终是原生启用的,至少直到安装 Hyper-V。我想知道为什么 Hyper-V 不能保持虚拟化功能启用,让其他应用程序正常运行呢?这个问题留给微软的工程师来回答……

© . All rights reserved.