如何强制 VirtualBox GuestOS CPUID 匹配 HostOS?

Posted

技术标签:

【中文标题】如何强制 VirtualBox GuestOS CPUID 匹配 HostOS?【英文标题】:How can I force VirtualBox GuestOS CPUID to match HostOS? 【发布时间】:2015-11-04 03:40:56 【问题描述】:

我正在尝试在 VirtualBox 中运行的 Windows VM 上测试一些跨平台软件,但是当我运行该程序时它崩溃并出现错误代码:0xC00000ID: Illegal Operation

当我查看反汇编时,我可以看到它是一条 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 等)是否有某些原因?

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


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

【问题讨论】:

您的 VortualBox 版本可能不支持模拟 AVX 指令。看来latest beta code 可以解决这个问题。您不妨尝试从here下载最新的 Win32 5.0 候选版本 Bingo - 我已经更新到 5.0.8,我的 CPUID 现在显示支持 AVX 并且程序运行完美。 【参考方案1】:

VirtualBox 5.0 beta-3 之前的版本不支持 AVX 指令集,也没有传递到 CPU。这是根据这个 Oracle VirtualBox bug report。下载并安装 >= 5.0 beta-3 的版本应该可以解决问题。

【讨论】:

以上是关于如何强制 VirtualBox GuestOS CPUID 匹配 HostOS?的主要内容,如果未能解决你的问题,请参考以下文章

搭建VirtualBox虚拟机集群

VirtualBox使用vboxmanage clonehd实现虚拟机克隆

强制关机后virtualbox虚拟机网络连不上

关于如何强制关闭lsass.exe

VirtualBox中如何使虚拟机能够上网?

如何在VirtualBox中安装MAC OS系统