Assembly PUSH指令是否会生成退出

Assembly PUSH指令是否会生成退出,assembly,x86,stack,virtual-machine,Assembly,X86,Stack,Virtual Machine,考虑以下来宾VM指令序列: 701: 55 push %rbp 702: 41 54 push %r12 704: 41 55 push %r13 对于上述任何一条指令,是否可以出于任何原因退出? 我认为是的,这是可能的,因为如果堆栈不存在,PUSH会引发页面错误 我是对的还是错的?我引用的是英特尔,因此暗指VT-x技术。 AMD-v与之类似(特别是,异常仍然被截获) 如果VMM(在VMX根模式下运行的程序)已将VMCS配置为允许,则异常可能导致VMExit: 异常。异常(故

考虑以下来宾VM指令序列:

701: 55     push %rbp 
702: 41 54  push %r12 
704: 41 55  push %r13
对于上述任何一条指令,
是否可以出于任何原因退出
? 我认为是的,这是可能的,因为如果堆栈不存在,PUSH会引发页面错误


我是对的还是错的?

我引用的是英特尔,因此暗指VT-x技术。
AMD-v与之类似(特别是,异常仍然被截获)


如果VMM(在VMX根模式下运行的程序)已将VMCS配置为允许,则异常可能导致VMExit:

异常。异常(故障、陷阱和中止)导致基于异常位图的VM退出(请参阅第节) 24.6.3). 如果发生异常,其向量(范围0–31)用于在异常位图中选择位。如果 位为1,出现VM退出;如果位为0,则异常通常通过来宾IDT传递

因此,如果指令序列生成任何异常,它将打开VMExit的可能性

除了#PF之外,
push
还可以生成其他异常:

#GP(0)如果内存地址是非规范形式。
#SS(0)如果堆栈地址是非规范形式。
#PF(错误代码)如果出现页面错误。
#AC(0)如果启用对齐检查,并且在 当前权限级别为3

正如评论中所指出的,VMExit也可能由于EPT(如果IIRC,则AMD术语中的嵌套页面)故障而发生。

此外,#GP与发布的代码片段无关。

是。它可以引发一个页面[错误][1]。[1] :@Johan如果
RSP-8
指向的页面不存在(或不可写或无效),则CPU在执行这些指令时将生成页面错误。#GP不能发生在给定指令上,因为它们没有内存操作数。这些指令还可能导致EPT冲突/错误配置VM出口,这些出口基本上是元页面错误。