X86 如何更改VirtualBox为来宾操作系统模拟的CPU指令集,如禁用SSE4.2指令集?

X86 如何更改VirtualBox为来宾操作系统模拟的CPU指令集,如禁用SSE4.2指令集?,x86,virtualbox,sse,cpuid,sse4,X86,Virtualbox,Sse,Cpuid,Sse4,我想要实现的是禁用VirtualBox为我的Linux来宾操作系统模拟的用于调试目的的CPU的SSE4.2指令集,即使真正的CPU支持VirtualBox所基于的SSE4.2指令集。我参考了VirtualBox手册页面,有几个命令可能与此问题相关: VBoxManage setextradata "VM name" VBoxInternal/CPUM/SSE4.2 0 上述命令无效 VBoxManage list hostcpuids 上述命令可用于转储主机CPU的CPUID参数。这可用于对

我想要实现的是禁用VirtualBox为我的Linux来宾操作系统模拟的用于调试目的的CPU的SSE4.2指令集,即使真正的CPU支持VirtualBox所基于的SSE4.2指令集。我参考了VirtualBox手册页面,有几个命令可能与此问题相关:

VBoxManage setextradata "VM name" VBoxInternal/CPUM/SSE4.2 0
上述命令无效

VBoxManage list hostcpuids
上述命令可用于
转储主机CPU的CPUID参数。这可用于对主机的虚拟化功能进行更细粒度的分析。
输出为:

Host CPUIDs:

Leaf no.  EAX      EBX      ECX      EDX
00000000  00000016 756e6547 6c65746e 49656e69
00000001  000906e9 02100800 7ffafbff bfebfbff
00000002  76036301 00f0b6ff 00000000 00c30000
00000003  00000000 00000000 00000000 00000000
00000004  1c004121 01c0003f 0000003f 00000000
00000005  00000040 00000040 00000003 00142120
00000006  000027f7 00000002 00000001 00000000
00000007  00000000 029c6fbf 00000000 00000000
00000008  00000000 00000000 00000000 00000000
00000009  00000000 00000000 00000000 00000000
0000000a  07300804 00000000 00000000 00000603
0000000b  00000001 00000001 00000100 00000004
0000000c  00000000 00000000 00000000 00000000
0000000d  0000001f 00000440 00000440 00000000
0000000e  00000000 00000000 00000000 00000000
0000000f  00000000 00000000 00000000 00000000
00000010  00000000 00000000 00000000 00000000
00000011  00000000 00000000 00000000 00000000
00000012  00000000 00000000 00000000 00000000
00000013  00000000 00000000 00000000 00000000
00000014  00000001 0000000f 00000007 00000000
00000015  00000002 0000011c 00000000 00000000
00000016  00000d48 00000ed8 00000064 00000000
00000017  00000d48 00000ed8 00000064 00000000
80000000  80000008 00000000 00000000 00000000
80000001  00000000 00000000 00000121 2c100800
80000002  65746e49 2952286c 726f4320 4d542865
80000003  35692029 3035372d 50432030 20402055
80000004  30342e33 007a4847 00000000 00000000
80000005  00000000 00000000 00000000 00000000
80000006  00000000 00000000 01006040 00000000
80000007  00000000 00000000 00000000 00000100
80000008  00003027 00000000 00000000 00000000
80000009  00000d48 00000ed8 00000064 00000000
我知道输出可能与X86指令密切相关,但我仍然不知道这些
叶号EAX EBX ECX EDX
行是什么意思。这些行与
CPUID
指令的输出之间有什么关系?我认为只有了解这些行与
CPUID
指令输出之间的关系,我们才能正确使用以下命令:

VBoxManage modifyvm --cpuid <leaf> <eax> <ebx> <ecx> <edx>
VBoxManage modifyvm--cpuid

上面的命令是我知道的唯一可能实现我的目标的方法,那么,
vboxmanagelist hostcpuids
的输出、后跟
Leaf no.EAX EBX ECX EDX
的内容和
CPUID
指令的输出之间的关系是什么?如何禁用VirtualBox为我的Linux来宾操作系统模拟的CPU的SSE4.2指令集,即使实际CPU支持VirtualBox所基于的SSE4.2指令集?
vboxmanagemodifyvm--cpuid
能否实现我的目标?如果您有其他方法来实现这一点,请告诉我。

如果可以在软件级别禁用SSE4,我会非常惊讶。另见报告和讨论。使用AVX可以启用/禁用操作系统支持,但不能启用CPU支持。请注意,除了标准SSE支持之外,SSE4不需要特殊的操作系统支持。还请注意,CPU执行CPU指令,即virtualbox不模拟这些指令。也许您可以通过添加
x86
和/或
simd
标记来吸引更多的注意力。@wim:
[sse]
是x86 SIMD的基线/通用标记,如果不遵循
sse*
@wim,人们往往会遵循它:应该可以修改CPUID行为,使其不报告SSE4.2可用(因为CPUID本身可以触发VM退出),因此可以测试非SSE4.2情况下的运行时调度。但正如您所说,这无助于您在检测到任何SSE4.2指令不可用后进行测试,以确保您的软件不会运行这些指令。为此,您需要BOCHS或qemu进行模拟,而不是硬件虚拟化。或者英特尔PIN。您想使用SSE4.2指令来引发#UD异常(非法指令)?就像\@wim和我说过的,硬件虚拟化不会发生这种情况。在硬件虚拟化中,如果不使所有SSE1/2/3指令也发生故障,那么就不能设置任何一个使SSE4.2指令发生故障的位。您需要一个模拟CPU,如BOCHS/qemu/Intel引脚。使用VBox,我认为您所能做的就是更改CPUID报告的内容。因此,它是一个仍然支持SSE4.2的CPU,但不会告诉任何人。