VM说明是否可以退出?

如何解决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窗口退出

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res