我试图在 VirtualBox 中运行的 Windows 虚拟机上测试一些跨平台软件,但当我运行该程序时,它崩溃并显示错误代码:0xC00000ID:非法操作。
当我查看此时的反汇编时,我可以看到它是 VMOVUPS 指令(AVX 指令集的一部分)。它在我的 Linux HostOS 上运行良好,这是我所期望的,因为我在支持 AVX 的机器上运行。有趣的是,主机上的 CPUID 结果与 guest 上的结果不匹配。
主持人:
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 的人暂时可能没有那么幸运。
最佳答案
早于 5.0 beta-3 的 VirtualBox 不支持 AVX 指令集,并且不会传递到 CPU。这是根据这个Oracle VirtualBox bug report 。下载并安装 >= 5.0 beta-3 的版本应该可以解决问题。
关于assembly - 如何强制 VirtualBox GuestOS CPUID 与 HostOS 匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33513272/