X86 如何更改VirtualBox为来宾操作系统模拟的CPU指令集,如禁用SSE4.2指令集?
我想要实现的是禁用VirtualBox为我的Linux来宾操作系统模拟的用于调试目的的CPU的SSE4.2指令集,即使真正的CPU支持VirtualBox所基于的SSE4.2指令集。我参考了VirtualBox手册页面,有几个命令可能与此问题相关: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参数。这可用于对
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,但不会告诉任何人。