Assembly 如果可以退出,VM说明? bebc: mov 3423441(%rip),%r11 异或(%rsp),%r11 mov%rdx,%r8 移动%rcx,%r9 测试%r8,%r8 jne bee3 mov$0x6c16,%rdi mov$0xc0f4,%rax vmwrite%rax,%rdi 普希夫

Assembly 如果可以退出,VM说明? bebc: mov 3423441(%rip),%r11 异或(%rsp),%r11 mov%rdx,%r8 移动%rcx,%r9 测试%r8,%r8 jne bee3 mov$0x6c16,%rdi mov$0xc0f4,%rax vmwrite%rax,%rdi 普希夫,assembly,x86,virtualization,instruction-set,addressing-mode,Assembly,X86,Virtualization,Instruction Set,Addressing Mode,对于上述指令,哪条指令可能导致退出?哪种类型的退出?还有退出的原因是什么?(假设页面包含神秘函数)。神秘函数在CPL0中运行。此答案基于英特尔VMX扩展,AMD可能有所不同。 此外,虚拟机扩展已经变得非常庞大和复杂(截至2020年10月),因此答案可能不会让您感到惊讶: 它们都可以和不能,具体取决于虚拟机配置,导致虚拟机退出(此后即退出) 根据上下文的不同,可能只有vmwrite会导致退出,但所有主流VMM、AFAICT都支持VMCS跟踪(读取:嵌套虚拟化),因此该指令可能都不会导致退出 代码似

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

此答案基于英特尔VMX扩展,AMD可能有所不同。
此外,虚拟机扩展已经变得非常庞大和复杂(截至2020年10月),因此答案可能不会让您感到惊讶:

它们都可以不能,具体取决于虚拟机配置,导致虚拟机退出(此后即退出)

根据上下文的不同,可能只有
vmwrite
会导致退出,但所有主流VMM、AFAICT都支持VMCS跟踪(读取:嵌套虚拟化),因此该指令可能都不会导致退出

代码似乎是一个符合Windows ABI的函数,它设置堆栈cookie并最终覆盖主机状态区域中的主机
rip


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

例外情况。异常(故障、陷阱和中止)导致基于异常位图的VM退出(请参阅第节) 24.6.3). 如果发生异常,其向量(范围0–31)用于在异常位图中选择位。如果 位为1,出现VM退出;如果位为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错误配置会发生- 物理地址,逻辑处理器遇到包含不受支持的 数值(见第28.2.3.1节)。如果没有EPT错误配置,但EPT分页失败,则会发生EPT冲突- 结构条目不允许使用来宾物理地址进行访问(见第28.2.3.2节)。页面修改- 当逻辑处理器确定需要创建页面修改日志条目时,将发生“页面修改日志已满”事件 当前日志已满(见第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
除了适用于所有指令的迂腐退出外,如果出现以下情况,此指令还可能导致退出:

VMWRITE。如果以下任何一项为真,VMWRITE指令将导致VM退出:
-“VMCS跟踪”VM执行控制为0。
-寄存器源操作数的位63:15(64位模式外的位31:15)并非全部为0。
-VMWRITE位图中的位n为1,其中n是寄存器源操作数的位14:0的值。见第节 24.6.15了解有关如何识别VMWRITE位图的详细信息

对任何其他指令访问内存的一些考虑


以下是始终导致退出的说明:

  • 诱骗
  • INVVPID
  • VMCALL
  • VMCLEAR
  • VMLAUNCH
  • VMPTRLD
  • VMPTRST
  • VMRESUME
  • VMXOFF
  • VMXON
这些指令可以退出:

  • CLTS
  • 外壳
  • ENCLV
  • HLT
  • 输入、输入/输入/输入/输入、输出、输出/输出/输出
  • INVLPG
  • INVPCID
  • LGDT、LIDT、LLDT、LTR、SGDT、SIDT、SLDT、STR
  • LMSW
  • 监视器
  • 来自CR3的MOV
  • 来自CR8的MOV
  • 移动到CR0
  • 移动到CR3
  • 移动到CR4
  • 移动到CR8
  • MOV-DR
  • 姆瓦特
  • 停顿
  • RDMSR
  • RDPMC
  • 兰德
  • RDSEED
  • RDTSC
  • RDTSCP
  • RSM
  • t使用
  • 等等
  • VMREAD
  • VMWRITE
  • WBINVD
  • WRMSR
  • XRTORS
  • X储蓄
最后,这些也是出口的其他来源:

  • 例外情况
  • 三重断层
  • 外部中断
  • 不可屏蔽中断(NMI)
  • 初始信号
  • 启动IPIs(SIPIs)
  • 任务开关
  • VMX抢占定时器
  • 中断窗口退出
  • NMI窗口正在退出

在我看来,这是显而易见的一个:vmwrite。它会导致
vmwrite
类型退出(代码25)。@Jester你的意思是说
vmwrite
是唯一可能导致退出的指令吗?从技术上讲,页面错误也可能导致vm退出,如果它被配置为这样做的话。假设代码本身存在且可执行,这意味着指令可以访问内存。@Jester感谢您的见解。这里假设包含神秘函数的页面(即包含地址0xb000–0xbfff的页面)存在于内存中(所有页面表都已正确配置)。神秘函数在CPL0中运行。因此,假设所有指令
 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
 bee3:       9c                      pushf