如何强制 VirtualBox GuestOS CPUID 匹配 HostOS?

How can I force VirtualBox GuestOS CPUID to match HostOS?

我正在尝试在 VirtualBox 中的 Windows VM 运行ning 上测试一些跨平台软件,但是当我 运行 程序崩溃并显示错误代码时: 0xC00000ID:非法操作

当我查看此时的反汇编时,我可以看到它是一条 VMOVUPS 指令(AVX 指令集的一部分)。它 运行 在我的 Linux HostOS 上运行良好,这是我所期望的,因为我 运行 在支持 AVX 的机器上使用。有趣的是,主机上的 CPUID 结果与来宾上的结果不匹配。

主持人:

IN:  eax=0x00000001 
OUT: eax=0x000206a7 ebx=0x05100800 ecx=0x1fbae3ff edx=0xbfebfbff

嘉宾:

IN:  eax=0x00000001 
OUT: eax=0x000206a7 ebx=0x00000800 ecx=0x00000209 edx=0x078bfbff

我尝试使用以下命令设置 CPU 功能,但这根本没有改变值。

vboxmanage modifyvm Windows --cpuidset 00000001 000206a7 00100800 1fbae3ff bfebfbff

VirtualBox 可能缺少这些 CPU 功能(AVX、SSE4 等)应该存在的原因吗?

P.S。如果它是相关的,VM 映像是前段时间生成的,可能是在不支持 AVX 的机器上生成的,但我仍然希望 modifyvm 命令甚至冷启动来修复它。


更新:我的 Virtualbox 版本 (4.0.3) 似乎没有将 AVX 指令传递给 CPU。更新到 v5.0.8 解决了我的问题,但使用 AVX2 的人暂时可能没那么幸运。

早于 5.0 beta-3 的 VirtualBox 不支持 AVX 指令集,因此未传递给 CPU。这是根据这个 Oracle VirtualBox bug report。下载并安装 >= 5.0 beta-3 的版本应该可以解决问题。