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