PUSH指令是否会生成EXIT

时间:2017-03-20 03:17:01

标签: assembly x86 stack virtual-machine

考虑以下guest虚拟机VM指令序列:

701: 55     push %rbp 
702: 41 54  push %r12 
704: 41 55  push %r13

对于上述任何一条指令,EXIT是否可以出于任何原因? 我认为是可能的,因为如果没有堆栈,PUSH会引发页面错误。

我是对还是错?

1 个答案:

答案 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与发布的代码段无关。