在虚拟环境里的代码当它执行某些指令或遇到某些事件后会退回到真实的系统环境中,这个状况我们就称为VM-EXIT。虚拟环境里的代码是没有办法检测自己所处的运行环境,它也不知道自己的哪条指令触发了VM-EXIT。
无条件引发VM-EXIT的指令:CPUID 、INVD、GETSEC、XSETBV、INVEPT、INVVPID、VMCALL、
VMCLEAR、VMLAUNCH、VMPTRLD、VMPTRST、VMREAD、VMWRITE、VMRESUME、VMXOFF、VMXON。VMFUNC是个例外,如果我们把“enable VM functions”置1 它允许在虚拟环境里执行而不产生VM-EXIT。
有条件引发VM-EXIT的指令:这取决于Pin-Based VM-Execution Controls、Primary Processor-Based VM-Execution Controls、Secondary Processor-Based VM-Execution Controls这三个VMCS区域的对应位设置。
All other bits in this field are reserved to 0. Software should consult the VMX capability MSR IA32_VMX_PROCBASED_CTLS2 (see Appendix A.3.3) to determine which bits may be set to 1. Failure to clear reserved bits causes subsequent VM entries to fail (see Section 26.2.1.1)
Intel 技术手册上有完整的设置说明,这里不再赘述。
对于无条件引发的vm-exit 我们必须提供对应的善后处理代码,我们尽量避免有条件引发VM-EXIT的指令,以简化代码的工程量。
我们通过指令: lea rax,VMExitHandler
invoke vmx_vmwrite,HOST_RIP, rax;addr VMExitHandler
告诉CPU当无条件引发VM-EXIT的指令执行时CPU从虚拟环境退出到真实环境时从VMExitHandler所指定的位置开始执行代码。
我们通过指令:lea rax,@ExitReason
mov rcx,VM_EXIT_REASON
vmread @ExitReason,rcx;VM_EXIT_REASON
获取本次VM-EXIT场景是由什么原因引起的。我们看下获取的数据结构:
其中前16位就是我们重点关注的对象:
也就是说总共有60多种原因都可以造成VM-EXIT,我们将在下一篇中以源码形式讲解无条件引发的vm-exit的处理方法以及页面保护。
页面更新:2024-03-15
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号