VM说明是否可以退出?

问题描述

bebc <mystery>:
 mov    3423441(%rip),%r11
 xor    (%rsp),%r11
 mov    %rdx,%r8
 mov    %rcx,%r9
 test   %r8,%r8
 jne    bee3
 mov    $0x6c16,%rdi
 mov    $0xc0f4,%rax
 vmwrite %rax,%rdi
 pushf

对于上述指令,哪条指令可能会导致退出以及哪种退出类型?还有退出的原因是什么? (假设页面包含神秘功能)。神秘功能正在CPL0中运行。

解决方法

此答案基于 Intel VMX扩展, AMD 可能有所不同。
此外,VM扩展已经变得非常庞大和复杂(截至2020年10月),因此答案可能并不令人惊讶:

它们全部可以不能,具体取决于VM配置,从而导致VM退出(因此,称为退出)。

取决于上下文,可能只有vmwrite会导致退出,但是所有主流VMM,AFAICT都支持VMCS阴影(读取:嵌套虚拟化)已有一段时间了,所以也许两者都不指令将导致退出。

该代码的序言似乎是符合Windows ABI的功能,该函数设置堆栈cookie,并最终覆盖主机状态区域中的主机rip


bebc:       4c 8b 1d e5 57 30 00    mov    3168229(%rip),%r11

如果发生故障,可能会导致退出(请参阅英特尔手册的25.2节):

例外。异常(故障,陷阱和中止)会导致VM基于异常位图退出(请参见第 24.6.3)。如果发生异常,则使用其向量(范围为0-31)选择异常位图中的一位。如果 该位为1,虚拟机退出;如果该位为0,则异常通常通过来宾IDT传递。

如果配置了退出窗口并且未屏蔽相对中断,则在执行该指令之前,CPU将生成一个退出,尽管该可能不能算作该指令本身生成的退出。

>

如果“中断窗口退出” VM执行控制为1,则在执行任何指令之前都会发生VM退出 如果RFLAGS.IF = 1,并且没有STI或MOV SS对事件的阻止(请参见表24-3)。

如果“ NMI窗口退出” VM执行控制为1,则在执行任何指令之前,VM退出发生 没有虚拟NMI阻止,MOV SS也没有事件阻止,STI也没有事件阻止 (请参阅表24-3)。

如果使用了EPT并且配置错误,或者检测到EPT违规(即模拟MMIO区域),则会导致退出。

使用来宾物理地址进行的访问可能会由于EPT配置错误,违反EPT和 页面修改日志已满事件。在翻译来宾过程中,EPT配置错误 物理地址,逻辑处理器遇到包含不支持的EPT分页结构条目 值(请参阅第28.2.3.1节)。如果没有EPT配置错误,但EPT分页- 结构条目不允许使用来宾物理地址进行访问(请参见第28.2.3.2节)。页面修改 当逻辑处理器确定需要创建页面修改日志条目时,将发生tion log-full事件 并且当前日志已满(请参阅第28.2.6节)。

 bec3:       4c 33 1c 24             xor    (%rsp),%r11

同上。

 bec7:       49 89 d0                mov    %rdx,%r8

该指令不会出错,但适用相同的出口。

 beca:       49 89 c9                mov    %rcx,%r9
 becd:       4d 85 c0                test   %r8,%r8
 bed0:       75 11                   jne    bee3
 bed2:       48 c7 c7 16 6c 00 00    mov    $0x6c16,%rdi
 bed9:       48 c7 c0 f4 c0 34 82    mov    $0xc0f4,%rax

同上。

 bee0:       0f 79 f8                vmwrite %rax,%rdi

除了适用于所有指令的学步车出口外,在以下情况下,这可能会导致退出:

VMWRITE。如果满足以下任一条件,则VMWRITE指令将导致VM退出:
—“ VMCS阴影” VM执行控件为0。
—寄存器源操作数的位63:15(64位模式之外的位31:15)不全为0。
— VMWRITE位图中的位n为1,其中n是寄存器源操作数的位14:0的值。见章节 24.6.15了解有关如何标识VMWRITE位图的详细信息。

 bee3:       9c                      pushf

任何其他指令访问存储器的注意事项。


以下是总是导致退出的说明:

  • 邀请
  • INVVPID
  • VMCALL
  • VMCLEAR
  • VMLAUNCH
  • VMPTRLD
  • VMPTRST
  • VMRESUME
  • VMXOFF
  • VMXON

以下说明可以退出:

  • CLTS
  • ENCLS
  • ENCLV
  • HLT
  • IN,INS / INSB / INSW / INSD,OUT,OUTS / OUTSB / OUTSW / OUTSD
  • INVLPG
  • INVPCID
  • LGDT,LIDT,LLDT,LTR,SGDT,SIDT,SLDT,STR
  • LMSW
  • MONITOR
  • CR3中的MOV
  • 来自CR8的MOV
  • 从MOV到CR0
  • MOV到CR3
  • MOV到CR4
  • MOV到CR8
  • MOV DR
  • MWAIT
  • 暂停
  • RDMSR
  • RDPMC
  • RDRAND
  • RDSEED
  • RDTSC
  • RDTSCP
  • RSM
  • TPAUSE
  • UMWAIT
  • VMREAD
  • VMWRITE
  • WBINVD
  • WRMSR
  • XRSTORS
  • XSAVES

最后,这些也是退出的其他来源:

  • 例外
  • 三重故障
  • 外部中断
  • 不可屏蔽中断(NMI)
  • INIT信号
  • 启动IPI(SIPI)
  • 任务开关
  • VMX抢占计时器
  • 中断窗口退出
  • NMI窗口退出

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...