相关SDM章节: 27.2.3- Information About NMI Unblocking Due to IRET

最近收到同事发来的一个问题,即:

VMCS 中的 Guest Interruptibility State field 的 bit3-Blocking by NMI 和 VM-exit Interrupt-information field 或 VM-exit qualification field 中 的 bit12,也就是NMI unblocking due to IRET 之间的关系是什么?VMM在调度Guest期间对这里的"bit12"的利用方式是怎样的?

硬件逻辑

通过查阅 SDM,可以获得以下信息:

  1. IRET指令的执行可能会导致 vmexit,vmexit 的原因可能为:faults,EPT violation,page-modification log-full events,或者 SPP-related events.

  2. 如果在IRET执行时,NMI处于被block状态,即 Guest Interruptibililty State 的 bit3-Blocking by NMI 为1。那么IRET的执行会导致NMI被解除block,也就是将 Blocking by NMI从1设置为0. 即使 IRET 本身导致了fault 或 vmexit,unblock 的硬件行为不会发生变化。

  3. 1中所述的所有 vmexit,都会在 VM-exit Interrupt-information field / VM-exit qualification 的 bit12 提供 NMI unblocking due to IRET 信息,指示本次vmexit 是由 IRET 导致,并且 IRET unblock 了NMI,也就是 IRET 指令的执行导致了 Guest Interruptibility field 的 bit3 Blocking by NMI 从1 变为了0.

    但是,NMI unblocking due to IRET 还需要其它条件辅助才能成立。

    • "NMI-exiting" control 为0,或 "virtual NMIs" control 为1
    • vmexit 没有写 IDT-vectoring information field 的 valid bit 为 1
    • vmexit 不是由 #DF(double fault) 异常导致的

    在这三个条件同时成立的情况下,IRET 导致的 vmexit 会 Unblock NMI,也就是将 NMI unblocking due to IRET 写1.

    • 如果 IRET 指令的一部分为memory access,"virtual NMIs" control 为0,NMI 在IRET指令执行之前就已经被block 了,那么 NMI unblocking due to IRET 会被写1.
    • 如果 IRET 指令的一部分为memory access,"virtual NMIs" control 为1,且 virtual-NMI 在IRET指令执行之前就已经被 block了,那么 NMI unblocking due to IRET 也会被写1.
  4. IRET也可能会导致 APIC-access vmexit,EPT misconfigrations,但这类 vmexit 不会携带 NMI unblocking due to IRET 信息。

具体的逻辑如下图所示,红色部分会最终将 NMI unblocking due to IRET 信息存储到 VM-exit Interrupt-information field 中。绿色部分最终会将 NMI unblocking due to IRET 存储到 VM-exit qualification field 中。

软件逻辑

  • 每次 vmexit 时

软件逻辑很简单,在每次 vmexit 时,均会查看上图中菱形框中的条件是否满足,如果满足,就直接对Guest Interruptibility state 的 bit3,也就是 Blocking by NMI 写1,以在下次 vmentry 之前屏蔽掉 NMI。这里隐含着一个软件逻辑:由于 IRET 导致的 vmexit 会修改 Blocking by NMI,但这是不合理的,因此需要在由 IRET 导致的 vmexit 产生后,重新修改Blocking by NMI,使其能够正常block NMI。

另一方面,如果菱形框中的条件不满足,就正常读取 Blocking by NMI 的值确定是否需要对 NMI 进行屏蔽。

  • 处理 EPT violation vmexit 或 PML_FULL vmexit 时

逻辑与每次 vmexit时相同。但这里读取的NMI unblocking due to IRET 信息来自vmexit qualification,而不是 每次 vmexit时的 vmexit interrupt information。

总结

Guest 执行 IRET 会导致本来处于"Blocking NMI"的Guest环境变为"not Blocking NMI",这是硬件逻辑的不合理之处,软件应该在检测到由 IRET 导致的 unblock NMI 动作之后,在root mode 对 NMI 重新 block。

VMX - block by NMI和 NMI unblockinig due to IRET 之间的关系的更多相关文章

  1. block(代码块)的介绍以及使用方法和变量之间的关系

    http://blog.csdn.net/menxu_work/article/details/8762848 block(代码块)的介绍以及使用方法和变量之间的关系 block(代码块)的介绍以及使 ...

  2. tablespace(表空间) / segment(断) / extent(盘区)/ block(块)/datafile(文件)之间的关系

    tablespace(表空间) / segment(断) / extent(盘区)/ block(块)之间的关系   tablespace : 一个数据库划分为一个或多个表逻辑单位,即表空间,每个表空 ...

  3. [转载]HDFS的'Block'和MapReduce的'Split'之间的关系和区别

    http://www.cnblogs.com/xuxm2007/archive/2011/09/01/2162011.html hadoop的分块有两部分,其中第一部分更为人熟知一点.   第一部分就 ...

  4. Linux ext2文件系统

    Linux最传统的磁盘文件系统(filesystem)使用的是ext2 1.ext2文件系统结构ext2文件系统划分为多个块组,每个块组拥有独立的inode/block,一个文件系统只有一个Super ...

  5. NMI计算

    NMI计算 NMI(Normalized Mutual Information)标准化互信息,常用在聚类中,度量两个聚类结果的相近程度.是社区发现(community detection)的重要衡量指 ...

  6. Oracle corrupt block(坏块) 详解

    转自:http://blog.csdn.net/tianlesoftware/article/details/5024966 一. 坏块说明 1.1 相关链接 在看坏块之前,先看几个相关的链接,在后面 ...

  7. HDFS Block Replica Placement实现原理

    1. 背景   Block Replica Placement——数据块复本存储策略,HDFS Namenode以此为依据选取数据块复本应存储至哪些HDFS Datanodes,策略的设计需要权衡以下 ...

  8. 【ios开发】Block编程

    1 什么是block iOS SDK 4.0开始,Apple引入了block这一特性.字面上说,block就是一个代码块,但是它的神奇之处在于在内联(inline)执行的时候(这和C++很像)还可以传 ...

  9. Block 再学习 !

    如何优雅的使用 Block? How Do I Declare A Block in Objective-C? 阮一峰的一句话解释简洁明了:闭包就是能够读取其它函数内部变量的函数 详情:http:// ...

随机推荐

  1. ctfshow—web—web7

    打开靶机 发现是SQL注入,盲注 过滤了空格符,可以用/**/绕过,抓包 直接上脚本 import requestss=requests.session()url='https://46a0f98e- ...

  2. 干电池升压3.3V的电源芯片

    PW5100适用于一节干电池升压到3.3V,两节干电池升压3.3V的升压电路,PW5100干电池升压IC. 干电池1.5V和两节干电池3V升压到3.3V的测试数据 两节干电池输出500MA测试: PW ...

  3. Lakehouse: 统一数据仓库和高级分析的新一代开放平台

    1. 摘要 数仓架构在未来一段时间内会逐渐消亡,会被一种新的Lakehouse架构取代,该架构主要有如下特性 基于开放的数据格式,如Parquet: 机器学习和数据科学将被作为头等公民支持: 提供卓越 ...

  4. 什么是Etcd,如何运维Etcd ?

    介绍 ETCD 是一个分布式.可靠的 key-value 存储的分布式系统,用于存储分布式系统中的关键数据:当然,它不仅仅用于存储,还提供配置共享及服务发现:基于Go语言实现. ETCD的特点 简单: ...

  5. 面对key数量多和区间查询低效问题:Hash索引趴窝,LSM树申请出场

    摘要:Hash索引有两个明显的限制:(1)当key的数量很多时,维护Hash索引会给内存带来很大的压力:(2)区间查询很低效.如何对这两个限制进行优化呢?这就轮到本文介绍的主角,LSM树,出场了. 我 ...

  6. nginx.service: control process exited, code=exited status=1

    安装linux的宝塔面板,结果面板显示nginx和php已经运行了,但是机器系统上并没有运行.记录一次nginx报错,操作步骤看下代码: [root@localhost nginx]# systemc ...

  7. Linux 通过端口终止进程

    以下命令可用于杀死占用某端口的所有进程. root 用户: kill -9 $(lsof -i tcp:进程号 -t) 非 root 用户: kill -9 $(sudo lsof -i tcp:进程 ...

  8. ChannelNets: 省力又讨好的channel-wise卷积,在channel维度进行卷积滑动 | NeurIPS 2018

    Channel-wise卷积在channel维度上进行滑动,巧妙地解决卷积操作中输入输出的复杂全连接特性,但又不会像分组卷积那样死板,是个很不错的想法   来源:晓飞的算法工程笔记 公众号 论文: C ...

  9. 第一个 IDEA 应用程序

    新建 Java Web 项目 打开 IDEA -> Create New Project 选择 Java -> Java EE -> Web Application 选择工作空间 项 ...

  10. Java面向对象(一)----初次见面

    面向对象 面向过程:根据业务逻辑从上到下写代码 函数式编程:对一些功能的代码封装到函数中,日后无需重复编写,直接调用函数就可以了 面向对象:将所有的功能进行封装,面对的事封装了功能的实体(对象),即面 ...