现代的虚拟机,都使用了VT技术,以便加快虚拟机的执行效率
Hyper-v虚拟机,在处理CPUID指令上,有点小BUG,导致同一代码片段,在真机和虚拟机上表现行为不同
下面我们来重现一下这个BUG,并完整分析一下造成的原因
测试环境:
Intel Core i7 2600K
HOST OS:Windows Server 2012 x64
GUEST OS:Windows 7 Pro x86
代码:
#include
#pragma comment(linker, "/entry:main")
int filter(EXCEPTION_POINTERS * pException, BOOL *pFound)
{
if(*(BYTE*)pException->ContextRecord->Eip == 0x90)
{
*pFound = FALSE;
}
return EXCEPTION_EXECUTE_HANDLER;
}
BOOL cpuid_test()
{
BOOL bFound = TRUE;
__try
{
__asm
{
mov eax, 0x12345678
pushfd;
or DWORD ptr [esp], 0x100;
popfd;
cpuid;
nop;</