如何强制 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?的主要内容,如果未能解决你的问题,请参考以下文章