考虑以下guest虚拟机VM指令序列:
701: 55 push %rbp
702: 41 54 push %r12
704: 41 55 push %r13
对于上述任何一条指令,EXIT
是否可以出于任何原因?
我认为是可能的,因为如果没有堆栈,PUSH会引发页面错误。
我是对还是错?
答案 0 :(得分:1)
我引用了英特尔,因而暗中提到了VT-x技术 但是AMD-v类似(特别是,例外情况仍然被截获)。
如果VMM(在VMX根模式下运行的程序)已配置VMCS以允许它,则异常会导致VMExit:
异常。异常(故障,陷阱和中止)会导致基于异常位图的VM退出(请参阅 24.6.3)。如果发生异常,则使用其向量(在0-31范围内)来选择异常位图中的位。如果 位为1,发生VM退出;如果该位为0,则通常通过guest IDT传递异常。
因此,如果指令序列生成任何异常,则会打开VMExit的可能性。
除了#PF之外,push
还可以生成其他例外:
#GP(0)如果内存地址是非规范形式。
#SS(0)如果堆栈地址是非规范形式的 #PF(故障代码)如果发生页面错误 #AC(0)如果启用了对齐检查,并且在进行未对齐的内存引用时 当前特权级别为3。
在评论中指出Ross Ridge,由于EPT(如果是IIRC,AMD术语中的嵌套页面)故障,也会发生VMExit。
此外,#GP与发布的代码段无关。