首页
社区
课程
招聘
[翻译]Intel手册-VT部分 第26章 VMX NON-ROOT OPERATION
2024-4-15 21:43 1903

[翻译]Intel手册-VT部分 第26章 VMX NON-ROOT OPERATION

2024-4-15 21:43
1903

目录

26 VMX NON-Root Operation

在使用 VMX 的虚拟化环境中,guest softwares堆栈通常在 VMX non root operation的逻辑处理器上运行。这种操作模式类似于虚拟化环境之外的普通处理器操作。本章介绍 VMX non root operation和普通处理器操作之间的差异,特别关注 VM Exits的原因(将逻辑处理器从 VMX non root operation转换为root operation)。描述了 VMX non root operation和普通处理器操作之间的差异。

在以下部分:

  • 第 26.1 节 “导致 VM Exits的指令”。
  • 第 26.2 节 “VM Exits的其他原因”。
  • 第 26.3 节 “VMX non root operation中指令行为的更改”。
  • 第 26.4 节 “VMX non root operation中的其他更改”。
  • 第 26.5 节 “VMX non root operation的特定功能”。
  • 第 26.6 节“不受限制的guests”。

第 26 章“VMX non root operation”描述了管理 VMX non root operation的数据控制结构。第 27 章“VM Entries”描述了处理器从 VMX root operation转换到 VMX non root operation时的 VM Entries的操作。第 28 章“VMX 退出”描述了 VM Exits的操作,处理器通过该操作从 VMX non root operation转换为 VMX root operation。

第 29 章“VMX 对地址转换的支持”描述了在 VMX non root operation中支持地址转换的两个功能。第 30 章“APIC 虚拟化和虚拟中断”介绍了在 VMX non root operation中支持中断虚拟化和高级可编程中断控制器 (APIC) 的功能。

26.1 导致VM退出的指令

如果在 VMX non root 操作中执行某些指令,可能会导致 VM Exits。除非另有说明,否则此类 VM Exits是“类似故障”,这意味着导致 VM Exits的指令不会执行,并且该指令不会更新任何处理器状态。第 28.1 节详细介绍了 VM Exits上下文中的架构状态。第 26.1.1 节定义了受故障和 VM Exits影响的指令之间的优先级。第26.1.2节标识了每当在 VMX non root operation中执行时导致VM退出的指令(因此永远不能在 VMX non root operation中执行)。第 26.1.3 节标识了根据某些 VM-execution control字段的设置导致 VM Exits的指令(参见第 25.6 节)。

26.1.1 故障和VM退出的相对优先级

以下原则描述了现有故障和 VM Exits之间的顺序:

  • 某些异常优先于 VM Exits。其中包括无效操作码异常、基于特权级别的故障1 以及基于检查任务状态段 (TSS) 中 I/O 权限位的一般保护异常。例如,执行 CPL = 3 的 RDMSR 会生成一般保护异常,而不是 VM Exits。2
  • 获取指令操作数时发生的故障优先于根据这些操作数的内容进行调节的 VM Exits(请参阅第 26.1.3 节中的 LMSW)。
  • 由执行 INS 和 OUTS 指令引起的 VM Exits(由于“无条件 I/O 退出”VM-execution control为 1 或由于“使用 I/O 位图控制为 1”而导致)优先于以下故障:
    • 由于相关段(INS 的 ES;OUTS 的 DS,除非被指令前缀覆盖)不可用而导致的一般保护故障
    • 由于偏移量超出相关段的限制而导致的一般保护故障
    • 对齐检查异常
  • 类似故障的 VM Exits优先于上述以外的异常。例如,CPL = 0 的不存在的 MSR 的 RDMSR 会生成 VM Exits,而不是一般保护异常。

当第 26.1.2 节或第 26.1.3 节(下文)识别出可能导致 VM Exits的指令执行时,假定该指令不会引发优先于 VM Exits的故障。

26.1.2 导致VM无条件退出的指令

以下指令在 VMX non root 操作中执行时会导致 VM Exits:CPUID、GETSEC、1 INVD 和 XSETBV。对于 VMX 引入的指令也是如此,其中包括:INVEPT、INVVPID、VMCALL、2 VMCLEAR、VMLAUNCH、VMPTRLD、VMPTRST、VMRESUME、VMXOFF 和 VMXON。

26.1.3 导致VM有条件退出的指令

某些指令会导致 VM 在 VMX non root 操作中退出,具体取决于 VM 执行控件的设置。根据所描述的条件,以下指令可能会导致“类似故障”VM Exits:

  • CLTS。 如果在 CR0 客户机/host掩码和 CR0 读影子中都设置了位置 3 中的位(对应于 CR0.TS),则 CLTS 指令会导致 VM Exits。

  • ENCLS。 如果“启用 ENCLS 退出”VM-execution control为 1 并且以下其中一项为真,则 ENCLS 指令会导致 VM Exits:

  • EAX 的值小于 63,ENCLS 退出位图中的相应位为 1(参见第 25.6.16 节)。

  • EAX 的值大于或等于 63,并且 ENCLS 退出位图中的位 63 为 1。

  • ENCLV。 如果“启用 ENCLV 退出”VM-execution control为 1 并且以下其中一项为真,则 ENCLV 指令会导致 VM Exits:

  • EAX 的值小于 63,ENCLV 退出位图中的相应位为 1(参见第 25.6.17 节)。

  • EAX 的值大于或等于 63,并且 ENCLV 退出位图中的第 63 位为 1。

  • ENQCMD,ENQCMDS。 每个指令的行为由“PASID 转换”VM-execution control的设置决定。如果该控制为 0,则指令正常执行。如果控制为 1,则指令行为被修改并可能导致 VM Exits。参见第 26.5.8 节。

  • HLT。 如果“HLT 退出”VM-execution control为 1,则 HLT 指令会导致 VM Exits。

  • 输入、INS/INSB/INSW/INSD、输出、OUTS/OUTSB/OUTSW/OUTSD。 每个指令的行为由“无条件 I/O 退出”和“使用 I/O 位图”VM 执行控件的设置决定:

  • 如果两个控制都为0,则指令正常执行。

  • 如果“无条件I/O退出”VM执行控制为1并且“使用I/O位图”VM执行控制为0,则该指令导致VM退出。

  • 如果“使用 I/O 位图”VM-execution control为 1,则如果该指令尝试访问与相应 I/O 位图中设置为 1 的位相对应的 I/O 端口,该指令将导致 VM Exits(请参见第 25.6 节) .4).如果 I/O 操作“环绕”16 位 I/O 端口空间(访问端口 FFFFH 和 0000H),则 I/O 指令会导致 VM Exits(“无条件 I/O 退出”VM-execution control)如果“使用 I/O 位图”VM-execution control为 1),则忽略该选项。

有关 INS 和 OUTS 指令可能引起的故障的 VM Exits优先级的信息,请参见第 26.1.1 节。

  • INVLPG。 如果“INVLPG 退出”VM-execution control为 1,则 INVLPG 指令会导致 VM Exits。

  • INVPCID。 如果“INVLPG exiting”和“enable INVPCID”VM-execution control均为 1,则 INVPCID 指令会导致 VM Exits。

  • LGDT、LIDT、LLDT、LTR、SGDT、SIDT、SLDT、STR。 如果“描述符表退出”VM-execution control为 1,这些指令会导致 VM Exits。

  • LMSW。 一般来说,如果 LMSW 指令会为 CR0 客户机/host掩码的低 4 位中设置的任何位写入与 CR0 读取影子中的相应位不同的值,则它会导致 VM Exits。 LMSW 永远不会清除 CR0 (CR0.PE) 的位 0;因此,如果满足以下任一条件,LMSW 会导致虚拟机退出:

  • 位置 0 中的位(对应于 CR0.PE)在 CR0 客户机/host掩码和源操作数中均被设置,并且位置 0 中的位在 CR0 读影子中被清除。

  • 对于 3:1 范围内的任何位位置,该位置的位在 CR0 客户机/host掩码中设置,并且源操作数和 CR0 读取影子中相应位的值不同。

  • LOADIWKEY。 如果“LOADIWKEY exiting”VM-execution control为 1,则 LOADIWKEY 指令会导致 VM Exits。

  • 监视器。 如果“MONITOR exiting”VM-execution control为 1,则 MONITOR 指令会导致 VM Exits。

  • 来自 CR3 的 MOV。 如果“CR3 存储退出”VM-execution control为 1,则来自 CR3 指令的 MOV 会导致 VM Exits。第一个支持虚拟机扩展的处理器仅支持该控制的 1 设置。

  • 来自 CR8 的 MOV。 如果“CR8 存储退出”VM-execution control为 1,则来自 CR8 指令的 MOV 会导致 VM Exits。

  • MOV 到 CR0。 MOV 到 CR0 指令会导致 VM Exits,除非其源操作数的值与 CR0 guest/host掩码中设置的每个位的位置匹配 CR0 读取影子中的相应位。 (如果 CR0 来宾/host掩码中的每一位都被清除,则 MOV 到 CR0 不会导致 VM Exits。)

  • MOV 到 CR3。 MOV 到 CR3 指令会导致 VM Exits,除非“CR3 加载退出”VM-execution control为 0 或者其源操作数的值等于 VMCS 中指定的 CR3 目标值之一。仅考虑前 n 个CR3 目标值,其中 n 是 CR3 目标计数。如果“CR3-load exiting”VM-execution control为 1 并且 CR3-target 计数为 0,则 MOV 到 CR3 始终会导致 VM Exits。

第一批支持虚拟机扩展的处理器仅支持“CR3 加载退出”VM-execution control的 1 设置。这些处理器总是参考 CR3 目标控件来确定 MOV 到 CR3 的执行是否会导致 VM Exits。

  • MOV 到 CR4。 MOV 到 CR4 指令会导致 VM Exits,除非其源操作数的值与 CR4 客户/host掩码中设置的每个位的位置匹配 CR4 读取影子中的相应位。

  • MOV 到 CR8。 如果“CR8加载退出”VM执行控制为1,则MOV到CR8指令会导致VM退出。

  • MOV 博士。 如果“MOV-DR 退出”VM-execution control为 1,则 MOV DR 指令会导致 VM Exits。此类 VM Exits代表第 26.1.1 节中确定的原则的例外,因为它们优先于以下内容:一般保护基于特权级别的例外情况;由于 CR4.DE=1 并且指令指定对 DR4 或 DR5 的访问而发生无效操作码异常。

  • 等待。 如果“MWAIT 退出”VM-execution control为 1,MWAIT 指令会导致 VM Exits。如果该控制为 0,则可以修改 MWAIT 指令的行为(请参见第 26.3 节)。

  • 暂停。 每个指令的行为取决于 CPL 以及“暂停退出”和“暂停循环退出”VM-execution control的设置:

  • CPL = 0

  • 如果“PAUSE退出”和“PAUSE循环退出”VM执行控制都为0,则PAUSE指令正常执行。

  • 如果“暂停退出”VM-execution control为 1,则 PAUSE 指令导致 VM Exits(如果 CPL = 0 且“暂停退出”VM-execution control为 1,则忽略“暂停循环退出”VM-execution control) 。

  • 如果“PAUSE退出”VM执行控制为0并且“PAUSE循环退出”VM执行控制为1,则应用以下处理。

    处理器确定本次执行 PAUSE 与上一次在 CPL 0 处执行 PAUSE 之间的时间量。如果该时间量超过 VM-execution control字段 PLE_Gap 的值,则处理器认为本次执行是第一次执行 PAUSE循环中。 (VM 进入后在 CPL 0 处首次执行 PAUSE 时也会这样做。)

    否则,处理器将确定自最近执行被视为循环中第一个 PAUSE 以来的时间量。如果该时间量超过VM执行控制字段PLE_Window的值,则发生VM退出。

    为了进行这些计算,时间是根据与时间戳计数器 (TSC) 相同速率运行的计数器来测量的。

  • CPL > 0。

  • 如果“PAUSE退出”VM执行控制为0,则PAUSE指令正常执行。

  • 如果“PAUSE退出”VM执行控制为1,则PAUSE指令导致VM退出。

    如果 CPL > 0,则忽略“暂停循环退出”VM-execution control。

  • PCONFIG。 如果“启用 PCONFIG”VM-execution control为 1 并且以下其中一项为真,则 PCONFIG 指令会导致 VM Exits:

  • EAX 的值小于 63,PCONFIG 退出位图中的相应位为 1(参见第 25.6.18 节)。

  • EAX 的值大于或等于 63,并且 PCONFIG 退出位图中的第 63 位为 1。

    如果“启用 PCONFIG”VM-execution control为 1 并且前面的各项均不成立,则 PCONFIG 指令正常执行。

  • RDMSR。 如果满足以下任一条件,则 RDMSR 指令会导致 VM Exits:

  • “使用 MSR 位图”VM-execution control为 0。

  • ECX 的值不在 00000000H – 00001FFFH 和 C0000000H – C0001FFFH 范围内。

  • ECX 的值在 00000000H – 00001FFFH 范围内,低 MSR 的读取位图中的位 n为 1,其中 n 是 ECX 的值。

  • ECX 的值在 C0000000H – C0001FFFH 范围内,高 MSR 的读取位图中的位 n为 1,其中 n 是 ECX & 00001FFFH 的值。

有关如何识别这些位图的详细信息,请参见第 25.6.9 节。

  • RDPMC。 如果“RDPMC 退出”VM-execution control为 1,则 RDPMC 指令会导致 VM Exits。

  • 研发。 如果“RDRAND exiting”VM-execution control为 1,则 RDRAND 指令会导致 VM Exits。

  • RDSEED。 如果“RDSEED exiting”VM-execution control为 1,则 RDSEED 指令会导致 VM Exits。

  • RDTSC。 如果“RDTSC 退出”VM-execution control为 1,则 RDTSC 指令会导致 VM Exits。

  • RDTSCP。 如果“RDTSC 退出”和“启用 RDTSCP”VM-execution control均为 1,则 RDTSCP 指令会导致 VM Exits。

  • RSM。 如果在系统管理模式 (SMM) 下执行,RSM 指令会导致 VM Exits。

  • 暂停。 如果“RDTSC 退出”和“启用用户等待和暂停”VM-execution control均为 1,则 TPAUSE 指令会导致 VM Exits。

  • 等等。 如果“RDTSC 退出”和“启用用户等待和暂停”VM-execution control均为 1,则 UMWAIT 指令会导致 VM Exits。

  • VMREAD。 如果满足以下任一条件,VMREAD 指令将导致 VM Exits:

  • “VMCS 影子”VM-execution control为 0。

  • 寄存器源操作数的位 63:15(64 位模式之外的位 31:15)不全为 0。

  • VMREAD 位图中的位 n 为 1,其中 n 是寄存器源操作数的位 14:0 的值。有关如何识别 VMREAD 位图的详细信息,请参阅第 25.6.15 节。

    如果VMREAD指令不导致VM退出,则它从VMCS链接指针引用的VMCS中读取。有关 VMREAD 指令操作的详细信息,请参见第 31 章“VMREAD — 从虚拟机控制结构读取字段”。

  • VMWRITE。 如果满足以下任一条件,VMWRITE 指令将导致 VM Exits:

  • “VMCS 影子”VM-execution control为 0。

  • 寄存器源操作数的位 63:15(64 位模式之外的位 31:15)不全为 0。

  • VMWRITE 位图中的位 n为 1,其中 n 是寄存器源操作数的位 14:0 的值。有关如何识别 VMWRITE 位图的详细信息,请参阅第 25.6.15 节。

如果 VMWRITE 指令不会导致 VM Exits,则它会写入由 VMCS 链接指针引用的 VMCS。有关 VMWRITE 指令操作的详细信息,请参见第 31 章“VMWRITE—将字段写入虚拟机控制结构”。

  • WBNVD。 如果“WBINVD 退出”VM-execution control为 1,则 WBINVD 指令会导致 VM Exits。

  • WBNOINVD。 如果“WBINVD 退出”VM-execution control为 1,则 WBNOINVD 指令会导致 VM Exits。

  • WRMSR。 如果满足以下任一条件,WRMSR 指令将导致 VM Exits:

  • “使用 MSR 位图”VM-execution control为 0。

  • ECX 的值不在 00000000H – 00001FFFH 和 C0000000H – C0001FFFH 范围内。

  • ECX 的值在 00000000H – 00001FFFH 范围内,低 MSR 的写入位图中的位 n为 1,其中 n 是 ECX 的值。

  • ECX 的值在 C0000000H – C0001FFFH 范围内,高 MSR 的写入位图中的位 n为 1,其中 n 是 ECX & 00001FFFH 的值。

有关如何识别这些位图的详细信息,请参见第 25.6.9 节。

  • XRSTORS。 如果“启用 XSAVES/XRSTORS”VM-execution control为 1 并且在以下三个值的逻辑与中设置任何位,则 XRSTORS 指令会导致 VM Exits:EDX:EAX、IA32_XSS MSR 和 XSS 退出位图(参见第 25.6.21 节)。

  • X保存。 如果“启用 XSAVES/XRSTORS”VM-execution control为 1 并且在以下三个值的逻辑与中设置任何位,则 XSAVES 指令会导致 VM Exits:EDX:EAX、IA32_XSS MSR 和 XSS 退出位图(参见第 25.6.21 节)。

26.2 VM Exits的其他原因

除了指令执行引起的VM退出外,以下事件也可能导致VM退出:

  • 例外情况。 异常(故障、陷阱和中止)导致 VM 根据异常位图退出(请参阅第 25.6.3 节)。如果发生异常,则使用其向量(范围为 0–31)来选择异常位图中的一个位。如果该位为1,则发生VM退出;如果该位为 0,则异常通过客户 IDT 正常传递。异常位图的这种使用也适用于指令 INT1、INT3、INTO、BOUND、UD0、UD1 和 UD2 生成的异常。

  • 三重故障。 如果逻辑处理器在尝试调用双故障处理程序时遇到异常,并且由于异常位图,该异常本身不会导致 VM Exits,则发生 VM Exits。这适用于在 VMX non root operation中生成双错误异常的情况、在VM条目的事件注入期间生成双错误异常的情况、以及VM条目在注入事件时生成双错误异常的情况。双故障异常。

  • 外部中断。 如果“外部中断退出”VM-execution control为 1,则外部中断会导致 VM Exits。(有关例外情况,请参阅第 26.6 节。)否则,处理器会正常处理中断。1(如果逻辑处理器处于shutdown 状态或 wait-for-SIPI 状态,外部中断被阻止,处理器确实处理中断并且不会发生 VM Exits。)

  • 不可屏蔽中断 (NMI)。 如果“NMI 退出”VM-execution control为 1,则 NMI 会导致 VM Exits。否则,它会使用 IDT 的描述符 2 进行传递。 (如果逻辑处理器处于等待SIPI状态,则NMI被阻塞。NMI不会通过IDT下发,并且不会发生VM退出。)

  • INIT 信号。 INIT 信号导致VM Exits。逻辑处理器不执行通常与这些事件相关的任何操作。此类退出不会像在 VMX 操作之外那样修改寄存器状态或清除挂起事件。 (如果逻辑处理器处于等待 SIPI 状态,则 INIT 信号将被阻止。在这种情况下,它们不会导致 VM Exits。)

  • 初创企业 IPI (SIPI)。 SIPI 会导致 VM Exits。 如果当 SIPI 到达时逻辑处理器未处于等待 SIPI 活动状态,则不会发生 VM Exits并且会丢弃 SIPI。由于 SIPI 导致的 VM Exits不会执行与这些事件相关的任何正常操作:它们不会像在 VMX 操作之外那样修改寄存器状态。 (如果逻辑处理器未处于等待 SIPI 状态,则 SIPI 会被阻止。在这种情况下,它们不会导致 VM Exits。)

  • 任务切换。 VMX 非 root 操作中不允许任务切换。任何在 VMX 非 root 操作中影响任务切换的尝试都会导致 VM Exits。参见第 26.4.2 节。

  • 系统管理中断 (SMI)。 如果逻辑处理器使用 SMI 的双显示器处理和系统管理模式 (SMM),则 SMI 会导致 SMM VM Exits。参见第 32.15.2 节。

  • VMX-抢占定时器。 当计时器倒计时至零时,VM Exits。有关 VMX 抢占定时器操作的详细信息,请参见第 26.5.1 节。

调试陷阱异常和较高优先级事件的优先级高于 VMX 抢占计时器引起的 VM Exits。由 VMX 抢占定时器引起的 VM Exits优先于由“NMI 窗口退出”VM-execution control和较低优先级事件引起的 VM Exits。

这些 VM Exits将逻辑处理器从与不可屏蔽中断相同的非活动状态唤醒。具体来说,它们将逻辑处理器从关闭状态以及使用 HLT 和 MWAIT 指令进入的状态唤醒。如果逻辑处理器处于等待 SIPI 状态,则不会发生这些 VM Exits。

  • 公交车锁。 如果“VMM 总线锁定检测”VM-execution control为 1,则总线锁定(请参见第 9.1.2 节)的断言会导致 VM Exits。这种 VM Exits类似于陷阱,因为它是在执行以下指令后生成的:断言总线锁定。因此,VM Exits不会阻止总线锁的断言。这些 VM Exits的优先级高于系统管理中断 (SMI)、INIT 信号和较低优先级事件。

  • 指令超时。 如果“指令超时”VM-execution control为 1,如果某些操作阻止处理器在指令超时控制 VM-execution control字段指定的时间内到达指令边界,则会发生 VM Exits(请参见第 25.6 节)。 25)。

此外,还有一些控制会根据客户软件是否准备好接收中断而导致 VM Exits:

  • 如果“中断窗口退出”VM-execution control为 1,则在 RFLAGS.IF = 1 且不存在 STI 或 MOV SS 阻塞事件的情况下,VM Exits在任何指令执行之前发生(参见表 25-3) 。如果上述条件成立的话,这样的VM退出会在VM进入后立即发生(参见第27.7.5节)。

    不可屏蔽中断 (NMI) 和较高优先级事件的优先级高于由此控制引起的 VM Exits。由该控制引起的VM退出优先于外部中断和较低优先级事件。

    这些 VM Exits将逻辑处理器从与外部中断相同的非活动状态唤醒。规格

    具体来说,它们将逻辑处理器从使用 HLT 和 MWAIT 指令进入的状态唤醒。如果逻辑处理器处于关闭状态或等待 SIPI 状态,则不会发生这些 VM Exits。

  • 如果“NMI 窗口退出”VM-execution control为 1,则在没有虚拟 NMI 阻塞且没有 MOV SS 阻塞事件和 STI 阻塞事件的情况下,在执行任何指令之前会发生 VM Exits(见表25-3)。如果上述条件成立,则这种 VM Exits在 VM 进入后立即发生(参见第 27.7.6 节)。

    由 VMX 抢占定时器和更高优先级事件引起的 VM Exits优先于由该控制引起的 VM Exits。由该控制引起的 VM Exits优先于不可屏蔽中断 (NMI) 和较低优先级事件。

    这些 VM Exits将逻辑处理器从与 NMI 相同的非活动状态唤醒。具体来说,它们将逻辑处理器从关闭状态以及使用 HLT 和 MWAIT 指令进入的状态唤醒。如果逻辑处理器处于等待 SIPI 状态,则不会发生这些 VM Exits。

26.3 VMX non root operation中指令行为的更改

某些指令的行为在 VMX non root operation中发生了变化。其中一些更改是由某些 VM-execution control字段的设置决定的。以下项目详细说明了此类更改:

  • CLTS。 CLTS 指令的行为由 CR0 客户机/host掩码中的位置 3(对应于 CR0.TS)中的位和 CR0 读取影子确定:

  • 如果 CR0 guest/host掩码中的位 3 为 0,则 CLTS 正常清除 CR0.TS(CR0 读取影子中的位 3 的值在这种情况下不相关),除非 CR0.TS 在 VMX 操作中固定为 1(请参阅第 24.8 节),在这种情况下 CLTS 会导致一般保护异常。

  • 如果 CR0 guest/host掩码中的位 3 为 1,并且 CR0 读取影子中的位 3 为 0,则 CLTS 完成,但不会更改 CR0.TS 的内容。

  • 如果 CR0 来宾/host掩码中位置 3 和 CR0 读取影子中的位均为 1,则 CLTS 会导致 VM Exits。

  • ENQCMD,ENQCMDS。 这些指令中的每一个都执行 64 字节排队存储,其中包括位 19:0 中的 PASID 值。对于 ENQCMD,PASID 通常是 IA32_PASID[19:0] 的值,而对于 ENQCMDS,PASID 通常是从内存中读取的。

每个指令的行为(特别是用于排队存储的 PASID 值)由“PASID 转换”VM-execution control的设置确定:

  • 如果“PASID 转换”VM-execution control为 0,则指令正常运行。

  • 如果“PASID 转换”VM-execution control为 1,则用于排队存储的 PASID 值由第 26.5.8 节中描述的 PASID 转换过程确定。 (请注意,PASID 转换可能会导致 VM Exits,在这种情况下,不会执行排队存储。)

    ENQCMD 或 ENQCMDS 的执行仅在检查可能导致一般保护异常的条件(检查 IA32_PASID。ENQCMD 的有效;ENQCMDS 的特权级检查)、从内存加载指令的源操作数之后才执行 PASID 转换,因此在加载可能导致的任何错误或VM退出之后(例如,页面错误或EPT违规)。 PASID 转换发生在实际队列存储之前,因此发生在它可能导致的任何故障或 VM Exits之前。

  • INVPCID。 INVPCID 指令的行为首先由“启用 INVPCID”VM-execution control的设置确定:

  • 如果“启用 INVPCID”VM-execution control为 0,则 INVPCID 会导致无效操作码异常 (#UD)。该异常优先于指令可能引起的任何其他异常。

  • 如果“启用 INVPCID”VM-execution control为 1,则根据“INVLPG 退出”VM-execution control的设置进行处理:

    • 如果“INVLPG退出”VM执行控制为0,则INVPCID正常运行。
    • 如果“INVLPG exiting”VM-execution control为 1,则 INVPCID 会导致 VM Exits。
  • IRET。 IRET 与 NMI 阻塞有关的行为(参见表 25-3)由“NMI 退出”和“虚拟 NMI”VM 执行控件的设置决定:

  • 如果“NMI exiting”VM-execution control为 0,IRET 正常运行并解锁 NMI。 (如果“NMI 退出”VM-execution control为 0,“虚拟 NMI”控制必须为 0;请参见第 27.2.1.1 节。)

  • 如果“NMI 退出”VM-execution control为 1,IRET 不会影响 NMI 的阻塞。此外,如果“虚拟 NMI”VM-execution control为 1,则逻辑处理器会跟踪虚拟 NMI 阻塞。在这种情况下,IRET 会删除任何虚拟 NMI 阻塞。

即使 IRET 导致故障,上述指定的 NMI 或虚拟 NMI 的解锁也会发生。

  • LMSW。 在 VMX non root operation之外,LMSW 将其源操作数加载到 CR0[3:0],但如果该位被设置,它不会清除 CR0.PE。在 VMX non root operation中,执行 LMSW 不会导致 VM Exits(请参阅第 26.1.3 节),从而使 CR0[3:0] 中对应于 CR0 来宾/host掩码中设置的位的任何位保持不变。尝试将 CR0[3:0] 中的任何其他位设置为 VMX 操作(参见第 24.8 节)不支持的值会导致一般保护异常。清除 CR0.PE 的尝试将被忽略,不会出现错误。

  • 来自 CR0 的 MOV。 来自 CR0 的 MOV 的行为由 CR0 来宾/host掩码和 CR0 读取影子决定。对于与 CR0 客户/host掩码中清零位相对应的每个位置,目标操作数将加载 CR0 中相应位的值。对于与 CR0 客户/host掩码中设置的位相对应的每个位置,目标操作数将加载 CR0 读取影子中相应位的值。因此,如果 CR0 客户/host掩码中的每一位都被清除,则 MOV from CR0 会正常从 CR0 读取;如果在 CR0 客户机/host掩码中设置了每个位,则 MOV from CR0 将返回 CR0 读取影子的值。

根据 CR0 客户机/host掩码和 CR0 读取影子的内容,可能会在目标中设置一些位,而直接从 CR0 读取时永远不会设置这些位。

  • 来自 CR3 的 MOV。 如果“启用 EPT”VM-execution control为 1,并且从 CR3 执行 MOV 不会导致 VM Exits(参见第 26.1.3 节),则从 CR3 加载的值是客户物理地址;参见第 29.3.1 节。

  • 来自 CR4 的 MOV。 CR4 中的 MOV 行为由 CR4 来宾/host掩码和 CR4 读取影子决定。对于与 CR4 客户/host掩码中的位清除相对应的每个位置,目标操作数将加载 CR4 中相应位的值。对于与 CR4 客户/host掩码中设置的位相对应的每个位置,目标操作数将加载 CR4 读取影子中相应位的值。因此,如果 CR4 客户/host掩码中的每一位都被清除,则 MOV from CR4 会正常从 CR4 读取;如果在 CR4 客户/host掩码中设置了每个位,则 MOV from CR4 将返回 CR4 读取影子的值。

根据 CR4 guest/host掩码和 CR4 读取影子的内容,可能会在目标中设置一些位,而直接从 CR4 读取时永远不会设置这些位。

  • 来自 CR8 的 MOV。 如果 CR8 指令中的 MOV 不会导致 VM Exits(请参阅第 26.1.3 节),并且“使用 TPR 影子”VM-execution control为 1,则其行为会被修改;参见第 30.3 节。

  • MOV 到 CR0。 执行 MOV 到 CR0 不会导致 VM Exits(请参阅第 26.1.3 节),从而使 CR0 中与 CR0 来宾/host掩码中设置的位相对应的任何位保持不变。对修改 CR0 中其他位的尝试的处理取决于“不受限制的来宾”VM-execution control的设置:

  • 如果控制为 0,则 MOV 到 CR0 尝试将 CR0 中的任何位设置为 VMX 操作不支持的值时会导致一般保护异常(请参见第 24.8 节)。

  • 如果控制为 1,则 MOV 到 CR0 尝试将 CR0 中除位 0 (PE) 或位 31 (PG) 之外的任何位设置为 VMX 操作中不支持的值时,会导致一般保护异常。然而,如果 MOV 到 CR0 会导致 CR0.PE = 0 且 CR0.PG = 1,或者如果会导致 CR0.PG = 1、CR4.PAE = 0,则情况仍然如此,则 MOV 会导致一般保护异常。 ,并且 IA32_EFER.LME = 1。

  • MOV 到 CR3。 如果“启用 EPT”VM-execution control为 1 并且执行 MOV 到 CR3 不会导致 VM Exits(请参阅第 26.1.3 节),则加载到 CR3 中的值将被视为客户物理地址;参见第 29.3.1 节。

  • 如果未使用 PAE 分页,则该指令不会使用客户物理地址来访问内存,也不会导致其通过 EPT 进行转换。

  • 如果使用 PAE 分页,则该指令通过 EPT 转换客户物理地址,并使用结果加载四 (4) 个页目录指针表条目 (PDPTE)。该指令不使用 PDPTE 的客户物理地址来访问内存,并且不会导致它们通过 EPT 进行转换。

  • MOV 到 CR4。 执行 MOV 到 CR4 不会导致 VM Exits(请参阅第 26.1.3 节),从而使 CR4 中与 CR4 来宾/host掩码中设置的位相对应的任何位保持不变。如果这样的执行尝试将 CR4 中的任何位(不对应于 CR4 客户/host掩码中设置的位)设置为 VMX 操作中不支持的值(请参见第 24.8 节),则会导致一般保护异常。

  • MOV 到 CR8。 如果 MOV 到 CR8 指令不会导致 VM Exits(请参阅第 26.1.3 节),并且“使用 TPR 影子”VM-execution control为 1,则其行为会被修改;参见第 30.3 节。

  • 等待。 MWAIT 指令的行为(总是导致无效操作码异常 — #UD — 如果 CPL > 0)由“MWAIT 退出”VM-execution control的设置决定:

  • 如果“MWAIT exiting”VM-execution control为 1,则 MWAIT 会导致 VM Exits。

  • 如果“MWAIT 退出”VM-execution control为 0,且满足以下条件之一,则 MWAIT 正常运行: (1) ECX[0] 为 0; (2) RFLAGS.IF = 1;或者以下两个条件都为真: (a)“中断窗口退出”VM-execution control为 0; (b) 逻辑处理器尚未识别待处理的虚拟中断(参见第 29.2.1 节)。

  • 如果“MWAIT 退出”VM-execution control为 0、ECX[0] = 1 且 RFLAGS.IF = 0,则 MWAIT 不会导致处理器进入依赖于实现的优化状态(如果“中断窗口退出”) VM-execution control为 1 或逻辑处理器已识别出待处理的虚拟中断;相反,控制权会传递到 MWAIT 指令后面的指令。

  • PCONFIG。 PCONFIG 指令的行为由“启用 PCONFIG”VM-execution control的设置决定:

  • 如果“启用 PCONFIG”VM-execution control为 0,则 PCONFIG 会导致无效操作码异常 (#UD)。该异常优先于指令可能引起的任何异常。

  • 如果“启用 PCONFIG”VM-execution control为 1,则 PCONFIG 可能会导致 VM Exits(如第 26.1.3 节所述);如果它没有导致这样的VM退出,则它运行正常。

  • RDMSR。 第 26.1.3 节标识了 RDMSR 指令的执行何时导致 VM Exits。如果这样的执行既不会导致由于 CPL > 0 导致的故障,也不会导致 VM Exits,则可以针对 ECX 的某些值修改指令的行为:

  • 如果 ECX 包含 10H(表示 IA32_TIME_STAMP_COUNTER MSR),则指令返回的值由“使用 TSC 偏移”VM-execution control的设置确定:

    • 如果控制为 0,RDMSR 正常运行,用 IA32_TIME_STAMP_COUNTER MSR 的值加载 EAX:EDX。
    • 如果控件为 1,则返回的值由“使用 TSC 缩放”VM 执行控件的设置确定:
      • 如果控制为 0,RDMSR 将 IA32_TIME_STAMP_COUNTER MSR 的值与 TSC 偏移值的总和加载 EAX:EDX。
      • 如果控制为 1,RDMSR 首先计算 IA32_TIME_STAMP_COUNTER MSR 的值与 TSC 乘数的值的乘积。然后,它将乘积的值右移 48 位,并使用该移位值与 TSC 偏移值之和加载 EAX:EDX。

    如果 ECX 包含 6E0H(指示 IA32_TSC_DEADLINE MSR),则“使用 TSC 偏移”VM-execution control的 1 设置不会影响 RDMSR 的执行。此类执行返回相对于实际时间戳计数器的 APIC 计时器截止时间,而不考虑 TSC 偏移量。

  • 如果 ECX 包含 48H(表示 IA32_SPEC_CTRL MSR),则指令返回的值由“virtualize IA32_SPEC_CTRL”VM-execution control的设置确定:

    • 如果控制为 0,RDMSR 正常运行,并使用 IA32_SPEC_CTRL MSR 的值加载 EAX:EDX。
    • 如果控制为 1,则返回的值是 VMCS 中 IA32_SPEC_CTRL 影子字段的值。
  • 如果 ECX 的范围为 800H–8FFH(表示 APIC MSR),并且“虚拟化 x2APIC 模式”VM-execution control为 1,则指令行为可能会被修改;参见第 30.5 节。

  • RDPID。 RDPID 指令的行为首先由“启用 RDTSCP”VM-execution control的设置确定:

  • 如果“启用 RDTSCP”VM-execution control为 0,则 RDPID 会导致无效操作码异常 (#UD)。

  • 如果“启用 RDTSCP”VM-execution control为 1,则 RDPID 正常运行。

  • RDTSC。 RDTSC 指令的行为由“RDTSC 退出”和“使用 TSC 偏移”VM 执行控件的设置决定:

  • 如果两个控件都为 0,则 RDTSC 正常运行。

  • 如果“RDTSC 退出”VM-execution control为 0,“使用 TSC 偏移”VM-execution control为 1,则返回值由“使用 TSC 缩放”VM-execution control的设置确定:

    • 如果控制为 0,RDTSC 将 IA32_TIME_STAMP_COUNTER MSR 的值与 TSC 偏移量的值之和加载 EAX:EDX。
    • 如果控制为 1,RDTSC 首先计算 IA32_TIME_STAMP_COUNTER MSR 的值与 TSC 乘数的值的乘积。然后,它将乘积的值右移 48 位,并使用该移位值与 TSC 偏移值之和加载 EAX:EDX。
  • 如果“RDTSC 退出”VM-execution control为 1,则 RDTSC 会导致 VM Exits。

  • RDTSCP。 RDTSCP 指令的行为首先由“启用 RDTSCP”VM-execution control的设置确定:

  • 如果“启用 RDTSCP”VM-execution control为 0,RDTSCP 会导致无效操作码异常 (#UD)。该异常优先于指令可能引起的任何其他异常。

  • 如果“启用 RDTSCP”VM-execution control为 1,则根据“RDTSC 退出”和“使用 TSC 偏移”VM-execution control的设置进行处理:

    • 如果两个控件都为 0,则 RDTSCP 正常运行。

    • 如果“RDTSC 退出”VM-execution control为 0,“使用 TSC 偏移”VM-execution control为 1,则返回值由“使用 TSC 缩放”VM-execution control的设置确定:

      • 如果控制为 0,RDTSCP 将 IA32_TIME_STAMP_COUNTER MSR 的值与 TSC 偏移值的总和加载 EAX:EDX。
      • 如果控制为 1,RDTSCP 首先计算 IA32_TIME_STAMP_COUNTER MSR 的值与 TSC 乘数的值的乘积。然后,它将乘积的值右移 48 位,并使用该移位值与 TSC 偏移值之和加载 EAX:EDX。

      无论哪种情况,RDTSCP 还会使用 IA32_TSC_AUX MSR 的位 31:0 的值加载 ECX。

    • 如果“RDTSC 退出”VM-execution control为 1,则 RDTSCP 会导致 VM Exits。

  • SMSW。 SMSW 的行为由 CR0 来宾/host掩码和 CR0 读取影子决定。对于与 CR0 客户/host掩码中清零位相对应的每个位置,目标操作数将加载 CR0 中相应位的值。对于与 CR0 客户/host掩码中设置的位相对应的每个位置,目标操作数将加载 CR0 读取影子中相应位的值。因此,如果 CR0 客户/host掩码中的每一位都被清除,则 SMSW 会正常从 CR0 读取;如果在 CR0 guest/host掩码中设置了每个位,则 SMSW 返回 CR0 读取影子的值。

请注意以下几点: (1) 对于任何内存目标或 16 位寄存器目标,仅使用 CR0 客户/host掩码和 CR0 读取影子的低 16 位(寄存器目标的位 63:16 保留)不变); (2) 对于 32 位寄存器目标,仅使用 CR0 客户/host掩码和 CR0 读影子的低 32 位(目标的 63:32 位被清除); (3) 根据 CR0 客户/host掩码和 CR0 读取影子的内容,可能会在目标中设置在直接从 CR0 读取时永远不会设置的位。

  • 暂停。 TPAUSE 指令的行为首先由“启用用户等待和暂停”VM-execution control的设置决定:

  • 如果“启用用户等待和暂停”VM-execution control为 0,则 TPAUSE 会导致无效操作码异常 (#UD)。该异常优先于指令可能引起的任何异常。

  • 如果“启用用户等待和暂停”VM-execution control为 1,则根据“RDTSC 退出”VM-execution control的设置进行处理:

  • 如果“RDTSC 退出”VM-execution control为 0,则指令延迟一段时间,此处称为 物理延迟 。首先通过确定 虚拟延迟 (相对于guest时间戳计数器的延迟时间)来计算物理延迟。

    如果 IA32_UMWAIT_CONTROL[31:2] 为零,则虚拟延迟为 EDX:EAX 中的值减去 RDTSC 将返回的值(见上文);如果 IA32_UMWAIT_CONTROL[31:2] 不为零,则虚拟延迟是该差值与 AND(IA32_UMWAIT_CONTROL,FFFFFFFCH) 的最小值。

    物理延迟取决于“使用 TSC 偏移”和“使用 TSC 缩放”VM 执行控件的设置:

    • 如果任一控制为 0,则物理延迟为虚拟延迟。
    • 如果两个控制均为 1,则虚拟延迟乘以 248(使用移位)以生成 128 位整数。然后将该乘积除以 TSC 乘数以生成 64 位整数。物理延迟就是这个商。
  • 如果“RDTSC 退出”VM-execution control为 1,则 TPAUSE 会导致 VM Exits。

  • 监控器。 UMONITOR 指令的行为由“启用用户等待和暂停”VM-execution control的设置决定:

  • 如果“启用用户等待和暂停”VM-execution control为 0,则 UMONITOR 会导致无效操作码异常 (#UD)。该异常优先于指令可能引起的任何异常。

  • 如果“启用用户等待和暂停”VM-execution control为 1,则 UMONITOR 正常运行。

  • 等等。 UMWAIT 指令的行为首先由“启用用户等待和暂停”VM-execution control的设置确定:

  • 如果“启用用户等待和暂停”VM-execution control为 0,则 UMWAIT 会导致无效操作码异常 (#UD)。该异常优先于指令可能引起的任何异常。

  • 如果“启用用户等待和暂停”VM-execution control为 1,则根据“RDTSC 退出”VM-execution control的设置进行处理:

    • 如果“RDTSC退出”VM执行控制为0,并且如果指令导致延迟,则延迟的时间量在此称为 物理延迟 。首先通过确定 虚拟延迟 (相对于guest时间戳计数器的延迟时间)来计算物理延迟。

      如果 IA32_UMWAIT_CONTROL[31:2] 为零,则虚拟延迟为 EDX:EAX 中的值减去 RDTSC 将返回的值(见上文);如果 IA32_UMWAIT_CONTROL[31:2] 不为零,则虚拟延迟是该差值与 AND(IA32_UMWAIT_CONTROL,FFFFFFFCH) 的最小值。

      物理延迟取决于“使用 TSC 偏移”和“使用 TSC 缩放”VM 执行控件的设置:

      • 如果任一控制为 0,则物理延迟为虚拟延迟。
      • 如果两个控制均为 1,则虚拟延迟乘以 248(使用移位)以生成 128 位整数。然后将该乘积除以 TSC 乘数以生成 64 位整数。物理延迟就是这个商。
    • 如果“RDTSC 退出”VM-execution control为 1,则 UMWAIT 会导致 VM Exits。

  • WRMSR。 第 26.1.3 节标识了 WRMSR 指令的执行何时导致 VM Exits。如果这样的执行既不是由于 CPL > 0 导致的故障,也不是 VM Exits,则可以针对 ECX 的某些值修改指令的行为:

  • 如果 ECX 包含 48H(指示 IA32_SPEC_CTRL MSR),则指令行为取决于“虚拟化 IA32_SPEC_CTRL”VM-execution control的设置:

    • 如果控制为 0,WRMSR 正常运行,用 EAX:EDX 中的值加载 IA32_SPEC_CTRL MSR。

    • 如果控制为 1,指令将尝试使用指令的源操作数写入 IA32_SPEC_CTRL MSR,但它将尝试仅修改与 VMCS 中 IA32_SPEC_CTRL 掩码字段中清除的位相对应的位置中的那些位。

      具体来说,该指令尝试将以下值写入 MSR:

      (MSR_VAL & ISC_MASK) 或 (SRC & NOT ISC_MASK),

      其中 MSR_VAL 是 MSR 的原始值,ISC_MASK 是 IA32_SPEC_CTRL 掩码,SRC 是指令的源操作数。

      将该值写入 MSR 所导致的任何故障(例如,由于保留位违规)通常都会发生。否则,该值将写入 MSR。

      对 MSR 的此类写入将产生在使用上述值写入 MSR 时通常会发生的任何副作用(包括因将未更改的值写入屏蔽位而可能产生的任何副作用)。

      如果写入完成且没有出现错误,则源操作数的未修改值将写入 VMCS 中的 IA32_SPEC_CTRL 影子字段。

  • 如果 ECX 包含 79H(指示 IA32_BIOS_UPDT_TRIG MSR),则不加载微码更新,并且控制传递到下一条指令。这意味着微代码更新无法在 VMX 非 root 操作中加载。

  • 在支持 Intel PT 但不允许在 VMX 操作中使用它的处理器上,如果 ECX 包含 570H(指示 IA32_RTIT_CTL MSR),则该指令会导致一般保护异常。

  • 如果 ECX 包含 808H(指示 TPR MSR)、80BH(EOI MSR)、830H(ICR MSR)或 83FH(self-IPI MSR),则如果“虚拟化 x2APIC 模式”VM 执行,则指令行为可能会被修改控制为1;参见第 30.5 节。

  • XRSTORS。 XRSTORS 指令的行为首先由“enable”的设置决定。

XSAVES/XRSTORS”VM-execution control:

  • 如果“启用 XSAVES/XRSTORS”VM-execution control为 0,XRSTORS 会导致无效操作码异常 (#UD)。

  • 如果“启用 XSAVES/XRSTORS”VM-execution control为 1,则处理基于 XSS 退出位图的值(请参阅第 25.6.21 节):

    • 如果在以下三个值的逻辑与中设置任何位,XRSTORS 会导致 VM Exits:EDX:EAX、IA32_XSS MSR 和 XSS 退出位图。
    • 否则,XRSTORS 会正常运行。
  • X保存。 XSAVES 指令的行为首先由“启用 XSAVES/XRSTORS”VM-execution control的设置确定:

  • 如果“启用 XSAVES/XRSTORS”VM-execution control为 0,XSAVES 会导致无效操作码异常 (#UD)。

  • 如果“启用 XSAVES/XRSTORS”VM-execution control为 1,则处理基于 XSS 退出位图的值(请参阅第 25.6.21 节):

  • 如果在以下三个值的逻辑与中设置任何位,XSAVES 会导致 VM Exits:EDX:EAX、IA32_XSS MSR 和 XSS 退出位图。

  • 否则,XSAVES 会正常运行。

26.4 VMX 非 root 操作中的其他更改

在 VMX non root operation中,事件阻塞、任务切换和某些影子堆栈更新的处理可能有所不同,如以下各节所述。

26.4.1 事件阻塞

VMX non root操作中的事件阻塞修改如下:

  • 如果“外部中断退出”VM-execution control为 1,则 RFLAGS.IF 不控制外部中断的阻止。在这种情况下,由于其他原因未被阻止的外部中断会导致 VM Exits(即使 RFLAGS.IF = 0)。
  • 如果“外部中断退出”VM-execution control为 1,则外部中断可能会或可能不会被 STI 或 MOV SS 阻止(行为特定于实现)。
  • 如果“NMI 退出”VM-execution control为 1,则不可屏蔽中断 (NMI) 可能会或可能不会被 STI 或 MOV SS 阻止(行为特定于实现)。

26.4.2 任务切换的处理

VMX 非 root 操作中不允许任务切换。任何在 VMX 非 root 操作中影响任务切换的尝试都会导致 VM Exits。但是,在可能因任务切换而导致 VM Exits之前,将执行以下检查(按指示的顺序),这可能会导致故障:

  • 如果正在使用任务门,则对其 P 位和相关特权字段的正确值进行适当的检查。以下案例详细说明了执行的权限检查:
    1. 如果 CALL、INT n 、INT1、INT3、INTO 或 JMP 在 IA-32e 模式下访问任务门,则会发生一般保护异常。
    2. 如果 CALL、INT n 、INT3、INTO 或 JMP 访问 IA-32e 模式之外的任务门,则会对该任务门执行特权级别检查,但如果它们通过,则不会在引用的任务状态段上检查特权级别(TSS)描述符。
    3. 如果 CALL 或 JMP 在 IA-32e 模式下直接访问 TSS 描述符,则会发生一般保护异常。
    4. 如果 CALL 或 JMP 在 IA-32e 模式之外直接访问 TSS 描述符,则会检查 TSS 描述符的特权级别。
    5. 如果不可屏蔽中断 (NMI)、异常或外部中断在 IA-32e 模式下访问 IDT 中的任务门,则会发生一般保护异常。
    6. 如果不可屏蔽中断 (NMI)、除断点异常 (#BP) 和溢出异常 (#OF) 之外的异常或外部中断访问 IA-32e 模式之外的 IDT 中的任务门,则不执行特权检查。
    7. 如果在 IA-32e 模式下以 RFLAGS.NT = 1 执行 IRET,则会发生一般保护异常。
    8. 如果在 IA-32e 模式之外以 RFLAGS.NT = 1 执行 IRET,则直接访问 TSS 描述符并且不进行特权检查。
  • 对新的 TSS 选择器进行检查(例如,在 GDT 限制内)。
  • 读取新的 TSS 描述符。 (如果相关的 GDT 页不存在,则会出现页错误)
  • 检查 TSS 描述符的类型(取决于任务切换的类型)、P 位、S 位和限制的正确值。

仅当检查 1-4 全部通过(不生成故障)时,才可能发生 VM Exits。然而,由于任务切换而导致的VM退出与由于访问旧TSS或新TSS而导致的页面错误之间的顺序是特定于实现的。如果访问任一 TSS 会导致页面错误,则某些处理器可能会生成页面错误(而不是由于任务切换而导致 VM Exits)。即使访问任一 TSS 会导致页面错误,其他处理器也可能会由于任务切换而生成 VM Exits。

如果通过 IDT 中的任务门进行任务切换的尝试导致异常(在由于任务切换而生成 VM Exits之前),并且该异常导致 VM Exits,则记录有关其传递访问任务门的事件的信息在IDT向量信息字段中,并且关于引起VM退出的异常的信息被记录在VM退出中断信息字段中。参见第 28.2 节。 VMCS 中未记录任务门被访问的事实。

如果通过 IDT 中的任务门进行任务切换的尝试导致 VM 由于任务切换而退出,则有关其传递访问任务门的事件的信息将记录在 VMCS 的 IDT 向量字段中。由于这种VM退出的原因是任务切换而不是中断,因此VM退出中断信息字段的有效位是0。参见第28.2节。

26.4.3 影子堆栈更新

如《英特尔® 64 和 IA-32 架构软件开发人员手册》第 1 卷第 17.2.3 节“Supervisor Shadow Stack Token”所述,影子堆栈的切换可能作为 IDT 事件传递或远程执行的一部分而发生。更改 CPL 的 CALL,或作为使用中断堆栈表 (IST) 的 IDT 事件传递的一部分。

作为影子堆栈切换的一部分,处理器通过操作位于新影子堆栈底部的 管理程序影子堆栈令牌 来获得对新堆栈的独占访问权。处理器读取令牌,并确认令牌的位 0(其 繁忙位 )为 0。如果繁忙位已为 1,则转换(事件传递或远调用)会导致一般保护故障并且没有完成。如果忙位为 0,则转换通过写入内存中的令牌来设置忙位。 (更新与令牌的原始读取是原子的。)

如果转换以 CPL < 3 开始,则它将在令牌更新之后将三个项目推送到新的影子堆栈上(对于 CS 选择器、指令指针和影子堆栈指针的旧值)。如《英特尔® 64 和 IA-32 架构软件开发人员手册》第 1 卷第 17.2.3 节所述,如果任何推送导致 VM Exits,处理器将恢复到旧的影子堆栈和新的影子堆栈中的繁忙位。影子堆栈的令牌保持设置状态。据说新的影子堆栈过早地繁忙。

如果“过早繁忙的影子堆栈”VM Exits控制为 1,则导致影子堆栈过早繁忙的 VM Exits将通过 VMCS 中保存的信息指示该事实。参见第 28.2.1 节。

26.5 VMX Non-root Operation特定的功能

某些 VM 执行控件支持特定于 VMX 非 root 操作的功能。这些是 VMX 抢占计时器(第 26.5.1 节)和监视器陷阱标志(第 26.5.2 节)、客户物理地址转换(第 26.5.3 节和第 26.5.4 节)、APIC 虚拟化(第 26.5.5 节) 、VM 功能(第 26.5.6 节)和虚拟化例外(第 26.5.7 节)。

26.5.1 VMX 抢占定时器

如果最后一个 VM Entries是通过“激活 VMX 抢占计时器”VM-execution control的 1 设置执行的,则 VMX 抢占计时器 在 VMX non root operation。当定时器倒计时到零时,它停止倒计时,并且发生 VM Exits(参见第 26.2 节)。

VMX 抢占计时器以与时间戳计数器 (TSC) 成比例的速率进行倒计时。具体地,每当TSC中的位X由于TSC增量而改变时,定时器就减1。 X 的值在 0–31 范围内,可以通过查阅 VMX 功能 MSR IA32_VMX_MISC 来确定(参见附录 A.6)。

VMX抢占定时器工作在C状态C0、C1和C2;它还可以在关闭和等待 SIPI 状态下运行。如果定时器在除等待 SIPI 状态之外的任何状态下计数到零,则逻辑处理器转换到 C0 C 状态并导致 VM Exits;如果计时器在等待 SIPI 状态下倒计时至零,则不会导致 VM Exits。在比 C2 更深的 C 状态中,计时器不会递减。

在系统管理中断 (SMI) 和系统管理模式 (SMM) 情况下定时器的处理取决于 SMI 和 SMM 的处理是否:

  • 如果 SMI 和 SMM 的默认处理(参见第 32.14 节)处于活动状态,则 VMX 抢占定时器对 SMI 到 VMX non root operation、SMM 中的后续执行以及通过 RSM 指令从 SMM 返回进行计数。但是,计时器只能导致 VM 从 VMX non root operation中退出。如果计时器在 SMI、SMM 或 RSM 期间到期,则计时器引发的 VM Exits将在具有正常优先级的 RSM 之后立即发生,除非它根据活动状态被阻止(第 26.2 节)。
  • 如果 SMI 和 SMM 的双监视器处理(参见第 32.15 节)处于活动状态,则进入和离开 SMM 的转换分别是 VM Exits和 VM 进入。这些转换对 VMX 抢占计时器的处理与普通 VM Exits和 VM 进入基本相同;第 32.15.2 节和第 32.15.4 节详细介绍了一些差异。

26.5.2 监视陷阱标志

监视器 陷阱标志 是一种调试功能,可导致 VMX non root operation中的某些指令边界上发生 VM Exits。此类 VM 出口称为 MTF VM 出口 。 MTF VM Exits可能发生在 VMX non root operation中的指令边界上,如下所示:

  • 如果“监视器陷阱标志”VM-execution control为 1 并且 VM Entries正在注入向量事件(请参阅第 27.6.1 节),则 MTF VM Exits将在 VM Entries之后的第一条指令之前的指令边界上挂起。
  • 如果VM入口正在注入挂起的MTF VM出口(参见第27.6.2节),则MTF VM出口将在VM入口之后的第一条指令之前的指令边界上挂起。即使“监视器陷阱标志”VM-execution control为 0,情况也是如此。
  • 如果“监视器陷阱标志”VM-execution control为 1,VM 入口不会注入事件,并且在指令执行之前会传递挂起事件(例如,调试异常或中断),则 MTF VM Exits将挂起在事件(或任何嵌套异常)传递后的指令边界。
  • 假设“监视陷阱标志”VM-execution control为 1,VM Entries未注入事件,并且 VM Entries之后的第一条指令是 REP 前缀的字符串指令:
    • 如果指令的第一次迭代导致故障,则在故障(或任何嵌套异常)传递后,MTF VM Exits将在指令边界上挂起。
    • 如果指令的第一次迭代没有导致故障,则在该迭代之后 MTF VM Exits将在指令边界上挂起。
  • 假设“监视陷阱标志”VM执行控制为1,VM入口没有注入事件,并且VM入口之后的第一条指令是XBEGIN指令。在这种情况下,MTF VM退出在XBEGIN指令的回退指令地址处待决。无论是否启用了 RTM 事务区域的高级调试,此行为都适用(请参阅《英特尔® 64 和 IA-32 架构软件开发人员手册》第 1 卷第 16.3.7 节“启用 RTM 的调试器支持”)。
  • 假设“监视陷阱标志”VM-execution control为 1,VM Entries未注入事件,并且 VM Entries之后的第一条指令既不是 REP 前缀字符串指令,也不是 XBEGIN 指令:
    • 如果指令导致故障,则 MTF VM Exits将在故障(或任何嵌套异常)传递后的指令边界上挂起。
    • 该指令不会导致故障,执行该指令后,MTF VM Exits将在指令边界上挂起。如果指令是 INT1、INT3 或 INTO,则此边界遵循任何软件异常的传递。如果指令是 INT n ,则该边界遵循软件中断的传递。如果指令是HLT,则MTF VM退出将从HLT活动状态。

MTF VM Exits发生在其挂起的指令边界上,除非更高优先级的事件优先或 MTF VM Exits由于活动状态而被阻止:

  • 系统管理中断 (SMI)、INIT 信号和更高优先级事件的优先级高于 MTF VM Exits。 MTF VM Exits优先于调试陷阱异常和较低优先级事件。
  • 如果处理器处于关闭活动状态或等待 SIPI 活动状态,则不会发生 MTF VM Exits。如果不可屏蔽中断随后使逻辑处理器脱离关闭活动状态而不导致 VM Exits,则 MTF VM Exits将在该中断传送后挂起。

特殊处理可能适用于英特尔 SGX 指令或逻辑处理器处于飞地模式的情况。详细信息请参见第 40.2 节。

26.5.3 使用 EPT 转换guest物理地址

扩展页表机制(EPT)是可用于支持物理内存虚拟化的功能。当使用EPT时,某些物理地址被视为客户物理地址并且不用于直接访问内存。相反,客户物理地址是通过遍历一组 EPT 分页结构来转换的,以生成用于访问内存的物理地址。

EPT 机制的详细信息在第 29.3 节中给出。

26.5.4 Intel Processor Trace 使用的guest物理地址的转换

如第 33 章所述,英特尔® 处理器跟踪(英特尔 PT)使用专用硬件设施捕获有关软件执行的信息。

Intel PT 可以配置为使用物理地址将跟踪输出写入内存。例如,当使用ToPA(物理地址表)输出机制时,IA32_RTIT_OUTPUT_BASE MSR包含当前ToPA基址的物理地址。该表中的每个条目都包含内存中输出区域的物理地址。当输出区域变满时,ToPA 输出机制将后续跟踪输出定向到 ToPA 中指示的下一个输出区域。

当“Intel PT 使用客户物理地址”VM-execution control为 1 时,逻辑处理器将 Intel PT 使用的地址(输出地址以及用于发现输出地址的地址)视为客户物理地址,转换为物理地址。在跟踪输出写入内存之前使用 EPT 寻址。

通过 EPT 转换这些地址意味着跟踪输出机制可能会导致 EPT 违规和 VM Exits;第 26.5.4.1 节提供了详细信息。第26.5.4.2节描述了一种确保这些VM退出不会导致跟踪数据丢失的机制。

26.5.4.1 Intel PT 的guest物理地址转换:详细信息

当“Intel PT 使用guest物理地址”VM-execution control为 1 时,Intel PT 使用的地址将被视为guest物理地址并使用 EPT 进行转换。这些地址包括输出区域的地址以及包含输出区域地址的 ToPA 条目的地址。

跟踪输出进程对访问的转换可能会导致 EPT 违规或 EPT 错误配置(第 29.3.3 节),从而导致 VM Exits。跟踪输出过程导致的 EPT 违规始终会导致 VM Exits,并且永远不会转换为虚拟化异常(第 26.5.7.1 节)。

如果没有发生 EPT 违规或 EPT 错误配置,并且启用了页面修改日志记录(第 29.3.6 节),则输出区域的地址可能会添加到页面修改日志中。如果日志已满,则会发生页面修改日志已满事件,从而导致 VM Exits。

如果“虚拟化APIC访问”VM执行控制为1,则跟踪输出进程使用的客户物理地址可以被转换为APIC访问页面上的地址。在这种情况下,跟踪输出进程的访问会导致 APIC 访问 VM Exits,如第 30.4.6.1 节中所述。

26.5.4.2 跟踪地址预转换 (TAPT)

由于它会在将 Intel PT 生成的跟踪数据写入内存之前对其进行缓冲,因此当 VM Exits禁用 Intel PT 时,处理器可确保缓冲的数据不会丢失。具体来说,处理器确保当前输出页中留有足够的空间用于缓冲数据。如果不这样做,缓冲的跟踪数据可能会丢失,并且生成的跟踪会损坏。

为了防止丢失缓冲的跟踪数据,处理器使用了一种称为 跟踪地址预转换 ( TAPT ) 的机制。通过 TAPT,处理器会使用 EPT 转换当前输出区域的客户物理地址,然后再使用该地址将缓冲的跟踪数据写入内存。

由于 TAPT,在输出写入内存时不会发生转换(因此不会发生 EPT 违规);对内存的写入使用作为 TAPT 的一部分缓存的翻译。 (第 26.5.4.1 节中给出的详细信息适用于 TAPT。)TAPT 确保,如果对输出区域的写入会导致 EPT 违规,则在使用该区域之前,在 TAPT 时传递生成的 VM Exits。这允许软件在当时解决 EPT 违规,并确保当需要将缓冲的跟踪数据写入内存时,该数据不会由于 EPT 违规而丢失。

TAPT(以及由此导致的 VM Exits)可能会在以下任意时间发生:

  • 当软件处于 VMX non root operation时,通过使用 WRMSR 指令或 XRSTORS 指令加载 IA32_RTIT_CTL MSR 以设置 TraceEn 位来启用跟踪。

    在这种情况下,由 TAPT 导致的任何 VM Exits都是类似陷阱的:WRMSR 或 XRSTORS 在 VM Exits发生之前完成(例如,保存在 VMCS 的客户状态区域中的 CS:RIP 值引用下一条指令)。

  • 在指令边界,当一个输出区域已满并且 Intel PT 转换到下一个输出区域时。

    在这种情况下,由 TAPT 导致的 VM Exits优先于任何挂起的调试异常。这样的VM退出将在VMCS的来宾状态区域中保存有关此类异常的信息。

  • 作为启用 Intel PT 的 VM Entries的一部分。详细信息请参见第 27.5 节。

TAPT不仅可以转换当前输出区域的客户物理地址,还可以转换后续输出区域的客户物理地址。 (这样做可以更好地保护跟踪数据。)这意味着由 TAPT 导致的任何 VM Exits都可能是由于当前输出区域地址以外的输出区域地址的转换所致。

26.5.5 APIC 虚拟化

APIC 虚拟化是可用于支持中断虚拟化和高级可编程中断控制器 (APIC) 的功能集合。启用 APIC 虚拟化后,处理器会模拟对 APIC 的多次访问、跟踪虚拟 APIC 的状态并提供虚拟中断 — 所有这些都在 VMX non root operation中进行,无需 VM Exits。

APIC 虚拟化的详细信息在第 30 章中给出。

26.5.6 虚拟机功能

VM 函数 是由处理器提供的操作,可以从 VMX non root operation调用,而无需 VM Exits。 VM功能通过VMCS中不同字段的设置来启用和配置。 VMX non root operation中的软件通过 VMFUNC 指令调用VM函数; EAX 的值选择要调用的特定 VM 函数。

第26.5.6.1节解释了如何启用VM功能。第 26.5.6.2 节指定了 VMFUNC 指令的行为。第26.5.6.3节描述了称为 EPTP交换 的特定VM功能。

26.5.6.1 启用虚拟机功能

软件通常通过设置“启用VM功能”VM执行控制来启用VM功能。通过设置相应的VM功能控制来启用特定的VM功能。

例如,假设该软件想要启用 EPTP 切换(VM 功能 0;请参阅第 25.6.14 节)。为此,它必须设置“激活辅助控制”VM-execution control(基于主处理器的位 31)。 VM-execution control)、“启用 VM 功能”VM-execution control(基于辅助处理器的 VM-execution control的位 13)和“EPTP 切换”VM 功能控制(VM 功能控制的位 0)。

26.5.6.2 VMFUNC 指令的一般操作

如果“启用 VM 功能”VM-execution control为 01 或 EAX 的值大于 63(只能启用 VM 功能 0-63),则 VMFUNC 指令会导致无效操作码异常 (#UD)。否则,如果 VM 功能控制中位置 EAX 处的位为 0(未启用所选 VM 功能),则该指令会导致 VM Exits。如果发生这样的VM退出,则使用的基本退出原因是59(3BH),表示“VMFUNC”,并且VMFUNC指令的长度被保存到VM-exit指令长度字段中。如果该指令既没有导致无效操作码异常,也没有由于禁用 VM 功能而导致 VM Exits,则它执行 EAX 中的值指定的 VM 功能的功能。

各个VM 功能可能会执行额外的故障检查(例如,如果CPL > 0,可能会导致一般保护异常)。此外,特定的VM功能可能包括可能导致VM退出的检查。如果发生此类 VM Exits,则会按照上一段所述保存 VM Exits信息。 VM函数的规范可以指示提供附加的VM退出信息。

EPTP 切换 VM 功能的具体行为(包括导致 VM Exits的检查)在第 26.5.6.3 节中给出。

26.5.6.3 EPTP 切换

EPTP 切换是 VM 功能 0。该 VM 功能允许 VMX non root operation中的软件为 EPT 指针(EPTP)加载新值,从而建立不同的 EPT 分页结构层次结构(有关操作的详细信息,请参阅第 29.3 节) EPT)。软件仅限于从 VMX root operation中软件预先配置的潜在 EPTP 值列表中进行选择。

具体来说,ECX 的值用于从 EPTP 列表中选择一个条目,EPTP 列表地址引用的 4 KB 结构(参见第 25.6.14 节;因为该结构包含 512 个 8 字节条目,VMFUNC 导致 VM如果 ECX ≥ 512 则退出)。如果所选条目是有效的 EPTP 值(它不会导致 VM Entries失败;请参阅第 27.2.1.1 节),则它将存储在当前 VMCS 的 EPTP 字段中,并用于使用客户物理地址的后续访问。以下伪代码提供了详细信息:

1
IF ECX ≥ 512``  ``THEN VM ``exit``;``  ``ELSE``    ``tent_EPTP := 8 bytes from EPTP-list address + 8 * ECX;``    ``IF tent_EPTP is not a valid EPTP value (would cause VM entry to fail ``if` `in EPTP)``      ``THEN VM ``exit``;``      ``ELSE``        ``write tent_EPTP to the EPTP field in the current VMCS;``        ``use tent_EPTP as the ``new` `EPTP value ``for` `address translation;``        ``IF processor supports the 1-setting of the “EPT-violation #VE” VM execution control``          ``THEN``            ``write ECX[15:0] to EPTP-index field in current VMCS;``              ``use ECX[15:0] as EPTP index ``for` `subsequent EPT-violation virtualization exceptions (see Section 26.5.7.2);``        ``FI;``    ``FI;``FI;

EPTP切换VM函数的执行不会修改任何寄存器的状态;没有修改任何标志。

如果“Intel PT 使用客户物理地址”VM-execution control为 1 并且 IA32_RTIT_CTL.TraceEn = 1,则 EPTP 切换 VM 函数的任何执行都会导致 VM Exits。

如第 26.5.6.2 节所述,导致 VM Exits(如上所述)的 EPTP 切换 VM 功能的执行使用基本退出原因 59,指示“VMFUNC”。 VMFUNC指令的长度被保存到vM-exit指令长度字段中。未提供额外的 VM Exits信息。

VMFUNC 的执行从 EPTP 列表加载 EPTP(因此不会导致故障或 VM Exits)称为一次

EPTP 交换 VMFUNC 。在 EPTP 切换 VMFUNC 之后,控制传递到下一条指令。逻辑性

处理器开始创建并使用与 EPTP 位 51:12 的新值关联的客户物理映射和组合映射;创建和使用的组合映射与当前 VPID 和 PCID 关联(VMFUNC 不会更改这些)。2 如果“启用 VPID”VM-execution control为 0,则 EPTP 切换 VMFUNC 将使与 VPID 0000H 关联的组合映射无效(对于所有 PCID 和所有 EP4TA 值,其中 EP4TA 是 EPTP 位 51:12 的值)。

由于 EPTP 切换 VMFUNC 可能会更改guest物理地址的转换,因此可能会影响 CR3 中guest物理地址的使用。 EPTP 切换 VMFUNC 本身无法由于 EPT 违规或由于通过新的 EPT 分页结构转换该客户物理地址而导致的 EPT 错误配置而导致 VM Exits。以下各项提供了 CR0.PG = 1 时适用的详细信息:

  • 如果使用 32 位分页或 4 级分页3(CR4.PAE = 0 或 IA32_EFER.LMA = 1),则使用线性地址的下一个内存访问将使用 CR3 中的客户物理地址通过新的转换进行的转换。 EPT 分页结构。因此,此访问可能会因转换过程中遇到 EPT 违规或 EPT 配置错误而导致 VM Exits。

  • 如果正在使用 PAE 分页(CR4.PAE = 1 且 IA32_EFER.LMA = 0),则 EPTP 切换 VMFUNC 不会 从 CR3 中的来宾物理地址加载四个页目录指针表条目 (PDPTE)。逻辑处理器继续使用 PDPTE 中已存在的四个客户物理地址。 CR3 中的客户物理地址不会通过新的 EPT 分页结构进行转换(直到某些操作会加载 PDPTE)。

    由于在任何 PDPTE 中的客户物理地址转换期间遇到 EPT 违规或 EPT 错误配置,EPTP 切换 VMFUNC 本身无法导致 VM Exits。使用线性地址的后续内存访问通过新的 EPT 分页结构使用适当的 PDPTE 中的客户物理地址的转换。因此,此类访问可能会由于转换过程中遇到的 EPT 违规或 EPT 错误配置而导致 VM Exits。

如果 EPTP 切换 VMFUNC 建立了一个 EPTP 值,该值启用 EPT 的已访问标志和脏标志(通过设置位 6),则如果自上次使用以来没有适当执行 INVEPT,则后续内存访问可能无法按指定设置这些标志。一个 EPTP 值,该值不会启用 EPT 的已访问标志和脏标志(因为位 6 已清除),并且与位 51:12 上的新值相同。

如果处理器支持“EPT违反#VE”VM执行控制的1设置,则EPTP切换VMFUNC将ECX[15:0]中的值加载到当前VMCS中的EPTP索引字段中。随后的 EPT 违规虚拟化异常将把该值保存到虚拟化异常信息区域中(参见第 26.5.7.2 节)。

26.5.7 虚拟化异常

虚拟化异常 是新处理器异常。它使用向量 20,缩写为#VE。

虚拟化异常仅在 VMX 非 root 操作中才会发生。虚拟化异常仅在某些 VM 执行控件的某些设置下发生。一般来说,这些设置意味着通常会导致虚拟机退出的某些条件会导致虚拟化异常

特别是,“EPT-violation #VE”VM-execution control的 1 设置会导致某些 EPT 违规生成虚拟化异常,而不是 VM Exits。第 26.5.7.1 节提供了处理器如何确定 EPT 违规是否导致虚拟化异常或 VM Exits的详细信息。

当处理器遇到虚拟化异常时,会将异常信息保存到虚拟化异常信息区;参见第 26.5.7.2 节。

保存虚拟化异常信息后,处理器会像传递任何其他异常一样传递虚拟化异常;详细信息请参见第 26.5.7.3 节。

26.5.7.1 可转换 EPT 违规

如果“EPT-violation #VE”VM-execution control为0(例如,在不支持此功能的处理器上),则EPT 违规始终会导致VM Exits。相反,如果控制为 1,则某些 EPT 违规可能会被转换为导致虚拟化异常;此类 EPT 违规行为是 可转换的 。

某些 EPT 分页结构条目的值确定哪些 EPT 违规是可转换的。具体来说,某些 EPT 分页结构条目的位 63 可以定义为表示 抑制 #VE :

  • 如果EPT分页结构条目的位2:0全为0,则该条目不 存在 。 1 如果处理器在转换客户物理地址时遇到此类条目,则会导致 EPT 违规。当且仅当条目的位 63 为 0 时,EPT 违规才可转换。
  • 如果存在 EPT 分页结构条目,则适用以下情况:
    • 如果不支持 EPT 分页结构条目的值,则该条目 配置错误 。如果处理器在转换客户物理地址时遇到此类条目,则会导致 EPT 错误配置(而不是 EPT 违规)。 EPT 错误配置总是会导致虚拟机退出。
    • 如果支持 EPT 分页结构条目的值,则适用以下情况:
      • 如果该条目的位7为1,或者该条目是EPT PTE,则该条目映射一个页面。如果处理器使用这样的条目来转换客户物理地址,并且对该地址的访问导致 EPT 违规,则当且仅当该条目的位 63 为 0 时,EPT 违规才是可转换的。
      • 如果该条目的位7为0并且该条目不是EPT PTE,则该条目引用另一个EPT寻呼结构。处理器不使用该条目的位 63 的值来确定任何后续 EPT 违规是否可转换。

如果对客户物理地址的访问导致 EPT 违规,则用于转换该地址的 EPT 分页结构条目之一的位 63 用于确定 EPT 违规是否可转换:要么是不存在的条目(如果来宾物理地址未转换为物理地址)或映射页面的条目(如果已转换)。

如果满足以下条件,则可转换 EPT 违规会导致虚拟化异常:

  • CR0.PE=1;
  • 逻辑处理器不在通过IDT传递事件的过程中;
  • EPT 违规不会导致影子堆栈过早繁忙(参见第 26.4.3 节);
  • EPT 违规不是由 Intel 处理器跟踪的输出过程导致的(第 26.5.4 节)
  • 虚拟化异常信息区中偏移量4处的32位全部为0。

虚拟化异常的传递将值 FFFFFFFFH 写入虚拟化异常信息区域中的偏移量 4(参见第 26.5.7.2 节)。因此,一旦发生虚拟化异常,只有软件清除该字段,才会发生另一个虚拟化异常。

26.5.7.2 虚拟化异常信息

虚拟化异常将数据保存到虚拟化异常信息区域(参见第 25.6.20 节)。表26-1列举了保存的数据和区域的格式。

VMM可以允许客户软件访问虚拟化异常信息区域。如果是这样,客户软件可能会修改该内存(例如,清除偏移量 4 处的 32 位值;请参阅第 26.5.7.1 节)。 (这是第 25.11.4 节中给出的一般要求的例外。)

图片描述

26.5.7.3 虚拟化异常的传递

保存虚拟化异常信息后,处理器会像对待其他异常一样对待虚拟化异常:

  • 如果 VMCS 中异常位图中的位 20 (#VE) 为 1,则虚拟化异常会导致 VM Exits(见下文)。如果该位为 0,则使用 IDT 中的门描述符 20 传递虚拟化异常。

  • 虚拟化异常不会产生错误代码。虚拟化异常的传递不会将错误代码推送到堆栈上。

  • 对于双错误,虚拟化异常与页面错误具有相同的严重性。如果虚拟化异常的传递遇到嵌套错误(促成错误或页面错误),则会生成双重错误 (#DF)。请参阅《英特尔® 64 和 IA-32 架构软件开发人员手册》第 3A 卷中的第 6 章“中断 8 — 双故障异常 (#DF)”。

    在传递另一个异常时不可能遇到虚拟化异常(参见第 26.5.7.1 节)。

如果虚拟化异常直接导致VM退出(因为异常位图中的位20为1),则异常信息通常保存在VMCS中的VM退出中断信息字段中(参见第28.2.2节)。具体来说,该事件被报告为带有向量 20 且没有错误代码的硬件异常。该字段的位 12(由于 IRET 导致 NMI 解锁)正常设置。

如果虚拟化异常间接导致VM退出(因为异常位图中的位20为0并且异常的传递生成导致VM退出的事件),则有关异常的信息通常保存在VMCS(参见第 28.2.4 节)。具体来说,该事件被报告为带有向量 20 且没有错误代码的硬件异常。

26.5.8 PASID Translation

ENQCMD 和 ENQCMDS 指令各自执行 64 字节入队存储,其中包括位 19:0 中的 20 位 PASID 值。对于 ENQCMD,PASID 通常是 IA32_PASID[19:0] 的值,而对于 ENQCMDS,PASID 通常是从内存中读取的。

如果“PASID 转换”VM-execution control为 1,则上一段中标识的 PASID 值将被视为来宾 PASID 。 PASID 转换将此guest PASID 转换为 20 位 host PASID 。在此转换之后,使用host PASID 代替来宾 PASID 来执行排队存储。PASID 转换是通过VMM 配置的两个数据结构层次结构( PASID 转换层次结构 )来实现的。guest PASID 00000H 到 7FFFFH 通过低 PASID 转换层次结构进行转换,而guest PASID 80000 到 FFFFFH 通过高 PASID 转换层次结构进行转换。

每个 PASID 转换层次结构的根是一个 4 KB 的 PASID 目录 。低PASID目录位于低PASID目录地址,高PASID目录位于高PASID目录地址(这些物理地址是VMCS中的VM执行控制字段)。 PASID 目录由 512 个 8 字节条目组成,每个条目的格式如下:

  • 位 0 是条目的当前位。仅当该位为 1 时才使用该条目。
  • 位 11:1 被保留并且必须为 0。
  • 位 M–1:12 指定 PASID 表的 4 KB 对齐地址(见下文),其中 M 是处理器的物理地址宽度。
  • 位 63:M 保留且必须为 0。

PASID 转换层次结构还包括多达 512 个 4 KB PASID 表 ;其中每一个都由 PASID 目录条目引用(见上文)。 PASID 表由 1024 个 4 字节条目组成,每个条目具有以下格式:

  • 位 19:0 是条目指定的host PASID。
  • 位 30:20 被保留并且必须为 0。
  • 位 31 是条目的有效位。仅当该位为 1 时才使用该条目。

启用 PASID 转换后,将使用以下过程将指令确定的guest PASID(参见上文)转换为host PASID:

  • 如果guest PASID 的位 19 清零,则使用低 PASID 目录;否则,使用高 PASID 目录。
  • guest PASID 的位 18:10 从 PASID 目录中选择一个条目。如果条目的当前位被清除或设置了任何保留位,则发生 VM Exits。否则,条目的位 M:0(位 0 被清除)包含 PASID 表的物理地址。
  • guest PASID 的位 9:0 从 PASID 表中选择一个条目。如果条目的有效位被清除或设置了任何保留位,则会发生 VM Exits。否则,条目的位 19:0 是host PASID。

如果 PASID 转换导致 VM Exits(由于当前或有效位被清除,或者保留位被设置),则指令不会完成,并且不会执行入队存储。

26.6 不受限制的guests

第一个支持 VMX 操作的处理器要求 CR0.PE 和 CR0.PG 在 VMX 操作中为 1(参见第 24.8 节)。此限制意味着guest softwares不能在未分页保护模式或实地址模式下运行。更高版本的处理器支持称为“无限制来宾”的 VM-execution control。1 如果此控制为 1,则在 VMX non root operation中 CR0.PE 和 CR0.PG 可能为 0。此类处理器允许客户软件在未分页保护模式或实地址模式下运行。以下各项描述了此类软件的行为:

  • MOV CR0 指令不会仅仅因为将 CR0.PE 和 CR0.PG 设置为 0 而导致一般保护异常。有关详细信息,请参见第 26.3 节。
  • 逻辑处理器在 VMX non root operation中处理 CR0.PE 和 CR0.PG 的值,就像在 VMX 操作之外一样。因此,如果 CR0.PE = 0,处理器将像正常在实地址模式下一样运行(例如,它使用 16 位 中断表 来传递中断和异常)。如果 CR0.PG = 0,则处理器在禁用分页时将正常运行。
  • 处理器操作会因处理器处于 VMX non root operation状态以及 VM 执行控件的设置(就像处于保护模式或启用分页时一样)而被修改。导致 VM 在保护模式下或启用分页时退出的指令、中断和异常在实地址模式下或禁用分页时也会这样做。应注意以下示例:
    • 如果CR0.PG = 0,则不会发生页面错误,因此不会导致VM退出。
    • 如果 CR0.PE = 0,则不会发生无效 TSS 异常,因此不会导致 VM Exits。
    • 如果 CR0.PE = 0,则以下指令会导致无效操作码异常,但不会导致 VM Exits:INVEPT、INVVPID、LLDT、LTR、SLDT、STR、VMCLEAR、VMLAUNCH、VMPTRLD、VMPTRST、VMREAD、VMRESUME、VMWRITE、VMXOFF、和VMXON。
  • 如果 CR0.PG = 0,则每个线性地址将直接传递到 EPT 机制以转换为物理地址。1 传递到 EPT 机制的客户内存类型是 WB(回写)。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2024-4-22 00:42 被zhang_derek编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (1)
雪    币: 19431
活跃值: (29097)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2024-4-16 09:17
2
1
感谢分享
游客
登录 | 注册 方可回帖
返回