assembly - 如何强制 VirtualBox GuestOS CPUID 与 HostOS 匹配?

标签 assembly visual-studio-2015 x86 virtualbox avx

我试图在 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/

相关文章:

c++ - CMake 找不到 Visual C++ 编译器

c - 为什么 makecontext 不适用于 pthreads

在没有原型(prototype)的情况下将 C 地址作为函数调用

在没有编译器生成序言/结尾和 RET 指令的情况下创建 C 函数?

visual-studio-2015 - 如果语法错误隐藏了我其余的代码,则会出现恼人的提示

wpf - 如何正确忽略由 Visual Studio 调试工具为 XAML 创建的窗口

程序集调用堆栈 - 术语问题

assembly leal 和 movl 的区别

c - 如何将这部分代码从汇编语言转换成C语言

assembly - 指令和微操作之间的区别