x64.asmwindows
guest发生异常时,陷入AsmVmmEntryPoint函数
以后保存现场,而后进入VmmVmExitHandler3d
而后VmmVmExitHandler根据异常的类型进行分发到不一样的handle,如:调试
case VmxExitReason::kMsrRead:
VmmpHandleMsrReadAccess(guest_context);
break;
case VmxExitReason::kMsrWrite:
VmmpHandleMsrWriteAccess(guest_context);
break;code
至强cpu会由于windows PG调用msr疯狂陷入到这里卡死ci
解决方法:文档
VmmpHandleMsrAccess中进行处理,当msr=0x400000F0的时候,返回0,即edx和eax都为0,由于rdmsr指令是经过ecx传入,而后将返回值放在edx和eax中,这里的ecx实际上就是0x400000F0,通过查阅intel developer manual,卷4,https://software.intel.com/en-us/download/intel-64-and-ia-32-architectures-software-developers-manual-volume-4-model-specific-registers,发现这个指令并无介绍,可是在正常状况下调试vmware中的虚拟机,发现一直返回的是0,所以这里直接返回0就好了。同步
另外关于xeon至强CPU和i系列CPU的差别:博客
xeon是经过pPmIdleGuestExecute陷入虚拟机
i7则是经过pPmIdleDefaultExecute陷入
上层调用则相同,目前暂未查到这两个函数的说明文档。
个人博客即将同步至腾讯云+社区,邀请你们一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1v4lrkv3u23dw