Intel SDM 之 APIC Virtualization and Virtual Interrupts

转自:https://zhuanlan.zhihu.com/p/678582276
0. 目录

  1. 垫话

  2. 前言

  3. 虚拟 APIC 状态[29.1]

3.1 虚拟 APIC 寄存器[29.1.1]

3.2 TPR 虚拟化[29.1.2]

3.3 PPR 虚拟化[29.1.3]

3.4 EOI 虚拟化[29.1.4]

3.5 self-IPI 虚拟化[29.1.5]

  1. 虚拟中断的评估与投递[29.2]

4.1 虚拟中断的评估[29.2.1]

4.2 虚拟中断投递[29.2.2]

  1. TPR CR8 访问虚拟化[29.3]

  2. APIC MMIO 访问虚拟化[29.4]

6.1 APIC-access VM exit 优先级[29.4.1]

6.2 APIC-access page 读虚拟化[29.4.2]

6.3 APIC-access page 写虚拟化[29.4.3]

6.3.1 确定一个写访问是否被虚拟化[29.4.3.1]

6.3.2 APIC-write emulation[29.4.3.2]

6.3.3 APIC-write VM exits[29.4.3.3]

6.4 特定指令情况[29.4.4]

6.5 page size 及 TLB 管理相关问题[29.4.5]

6.6 非直接由线性地址访问所引发的 APIC 访问[29.4.6]

6.6.1 APIC-access page 的 guest 物理地址访问[29.4.6.1]

6.6.2 APIC-access page 的物理地址访问[29.4.6.2]

  1. APIC MSR 访问虚拟化[29.5]

  2. posted-interrupt 处理[29.6]

  3. 垫话
    本文乃 Intel SDM “Chapter 29 APIC Virtualization and Virtual Interrupts” 一章的翻译。

要点概述:

APIC 虚拟化的控制位大多位于 VMCS 中。
APIC MMIO(guest 通过 IA32_APIC_BASE MSR 中的线性地址来操作 APIC)的虚拟化有两种手法,其一为 VMM 通过 EPT 映射 guest 的 APIC 的物理地址,使得 guest 对 APIC 线性地址的访问皆触发 VM exit,也就是纯软件模拟;其二为将 “virtualize APIC accesses” VM-execution control 置 1,如此 guest 对 APIC 的访问都被转发至 APIC-access page(其地址在 VMCS 中),第二种方法也需要配置 EPT,使得 guest 对 APIC 线性地址的访问,都被翻译为对 APIC-access page 的访问。
单从上一条看,APIC-access page 似乎并无优势,因为对 APIC-access page 的访问还是会触发 APIC-access VM exit。但如果结合一些其他 VM-execution control 配置,可以使得对 APIC-access page 的某些访问不退出,而是由处理器自动转发为对 virtual-APIC page 的访问(VMM 为每个 VCPU 分配其专属的 virtual-APIC page,并通过 VMCS 告知处理器,当 guest 通过线性地址访问 APIC-access page 时,自动转发为对 virtual-APIC page 的访问),并由硬件完成相应访问的虚拟化,相对 EPT 纯软件模拟性能更好。
virtual-APIC page 可以理解为 APIC-access page 的 backend。
APIC MSR 访问也是利用 virtual-APIC page。
不 VM exit(也即 non-root 下)的虚拟中断评估与投递,需要 “virtual-interrupt delivery” VM-execution control 为 1,该机制基于 virtual-APIC page。
PI 的处理需要处理器接受一个 posted-interrupt notification vector 中断,虚拟中断在被处理之前记录在一个 posted-interrupt descriptor 中,处理器对 PI 的底层虚拟化处理,会将中断记录到 virtual-APIC page 中。
2. 前言
VMCS 控制了中断及 APIC 虚拟化的使能。如果使能 APIC 虚拟化,处理器会自动模拟 APIC 的大多数操作、追踪虚拟 APIC 的状态并投递虚拟中断 —— 一切都在 VMX non-root 下不会触发 VM exit。

原注:大多数情况下无需 VMM 在 VM entry 的时候注入虚拟中断。

处理器对虚拟 APIC 状态的追踪需要借助一个 VMM 可识别的 virtual-APIC page。

下面是与 APIC 虚拟化及虚拟中断有关的 VM-execution controls(译者注:下面罗列的都是些控制位):

virtual-interrupt delivery:此控制位使能虚拟中断的评估及投递,使能对 APIC 控制中断优先级的寄存器的写操作模拟(基于 MMIO 或 MSR)。
use TPR shadow:此控制位使能基于 CR8 对 APIC TPR 访问的模拟(基于 MMIO 或 MSR)。
virtualize APIC accesses:此控制位通过配置对 VMM-specified APIC-access page 的访问触发 VM exit,来使能 APIC MMIO 访问的虚拟化。其他控制位设置了的情况下,部分访问可能会走模拟而不是 VM exit(译者注:意思就是通过设置一些其他控制位,让 MMIO 的 APIC 模拟不是所有操作都走 VM exit,如此提升性能)。
virtualize x2APIC mode:此控制位使能基于 MSR 的 APIC 操作虚拟化。
APIC-register virtualization:此控制位使能通过 virtual-APIC page 来返回大多数 APIC 寄存器的 MMIO 及 MSR 读操作。将对 APIC-access page 的 MMIO 写定向到 virtual-APIC page。随后触发 VM exit 以让 VMM 来模拟。
process posted interrupts:此控制位支持软件将虚拟中断 post 到一个数据结构中,并向另外一个逻辑处理器发送 notification;收到 notification 后,目标处理将 posted 中断拷贝到 virtual-APIC page 中。
“virtualize APIC accesses”、“virtualize x2APIC mode”、“virtual-interrupt delivery” 及 “APIC-register virtualization” 都是 secondary processor-based VM-execution controls。如果 primary processor-based VM-execution controls 的 bit 31 为 0,则处理器的行为与这些 controls 未使能的情况一致。

  1. 虚拟 APIC 状态[29.1]
    virtual-APIC page 是一个 4KB 内存区域,处理器用来模拟 APIC 寄存器的访问以及对虚拟中断进行管理。virtual-APIC page 的物理地址为 virtual-APIC address,是 VMCS 中的一个 64 bit VM-execution control 域。

3.1 虚拟 APIC 寄存器[29.1.1]
取决于具体 VM-execution controls,一个逻辑处理器可以通过如下 virtual-APIC page 中的域来虚拟对 APIC 寄存器的访问。

virutal task-priority register(VTPR):virtual-APIC page 偏移 080H 大小 32 bit。
virtual proessor-priority register(VPPR):virtual-APIC page 偏移 0A0H 大小 32 bit。
virtual end-of-interrupt register(VEOI):virtual-APIC page 偏移 0B0H 大小 32 bit。
virtual interrupt-service register(VISR):256 bit,包含 32 个 virtual-APIC page 中的非连续字段,偏移分别是 100H、110H、120H、130H、140H、150H、160H 及 170H。
virtual interrupt-request register(VIRR):256 bit,包含 32 个 virtual-APIC page 中的非连续字段,偏移分别是 200H、210H、220H、230H、240H、250H、260H 及 270H。
virutal interrupt-command register(VICR_LO):virtual-APIC page 偏移 300H 大小 32 bit。
virutal interrupt-command register(VICR_HI):virtual-APIC page 偏移 310H 大小 32 bit。
当 “use TPR shadow” VM-execution control 为 1 时,VTPR 域会虚拟 TPR。当 “virtual-interrupt delivery” VM-execution control 为 1 时,以上其他域虚拟相应的 APIC 寄存器。

译者注:很容易理解,TPR 与中断投递无关(严格意义上来说也有关,只不过影响的是是否将本次中断投递给处理器,但其并不参与中断投递过程中 IRR、ISR、EOI 以及 ICR-IPI 的那些时序逻辑);其他寄存器都与中断投递有关(好吧,PPR 功能上类似 TPR,但可能因为 PPR 是只读寄存器,所以和其他投递相关寄存器共用同一使能开关吧)。

3.2 TPR 虚拟化[29.1.2]
引发 TPR 虚拟化的具体操作:(1)CR8 MOV 指令的虚拟化;(2)对 APIC-access page 080H 偏移写的虚拟化;(3)ECX = 808H 的 WRMSR 指令虚拟化。

任何由 TPR 虚拟化所触发的 VM exit 是 trap-like 的:导致 TPR 虚拟化的指令在 VM exit 之前就已经完成(举例来说,VMCS guest-state area 中保存的 CS:RIP 指向下一条指令)。

3.3 PPR 虚拟化[29.1.3]
引发 PPR 虚拟化的具体操作:(1)VM entry;(2)TPR 虚拟化;(3)EOI 虚拟化。

PPR 虚拟化会用到 guest 的中断状态(具体来说,SVI;见 Section 24.4.2)以及 VTPR。

PPR 虚拟化只会由 TPR 虚拟化、EOI 虚拟化及 VM entry 引发(译者注:这里不是指 guest 里面 VM entry,也即嵌套虚拟化。这里指的就是 host VM entry 时触发中断评估及投递。)。虚拟中断的投递会修改 VPPR。其他操作都不会修改 VPPR,即使它们修改了 SVI、VISR 或 VTPR。

3.4 EOI 虚拟化[29.1.4]
引发 EOI 虚拟化的基本操作:(1)对 APIC-access page 0B0H 偏移写的虚拟化;(2)ECX = 80BH 的 WRMSR 指令的虚拟化。只有 “virtual-interrupt delivery” VM-execution control 为 1 时才会发生 EOI 虚拟化。

EOI 虚拟化会用到并更新 guest 的中断状态(具体来说,SVI)。

任何由 EOI 虚拟化所触发的 VM exit 是 trap-like 的:导致 EOI 虚拟化的指令在 VM exit 之前就已经完成(举例来说,VMCS guest-state area 中保存的 CS:RIP 指向下一条指令)。

3.5 self-IPI 虚拟化[29.1.5]
引发 self-IPI 虚拟化的基本操作:(1)对 APIC-access page 300H 偏移写的虚拟化;(2)ECX = 83FH 的 WRMSR 指令的虚拟化。只有 “virtual-interrupt delivery” VM-execution control 为 1 时才会发生 self-IPI 虚拟化。

每个触发 self-IPI 虚拟化的操作都会提供一个 8 bit vector。self-IPI 会更新 guest 的中断状态(具体来说,SVI)。

  1. 虚拟中断的评估与投递[29.2]
    如果 “virtual-interrupt delivery” VM-execution control 为 1,VMX non-root 下的特定行为或 VM entry 会触发处理器的虚拟中断评估与投递。

引发 virtual-APIC page 状态变化的动作(Section 29.2.1)会触发虚拟中断评估。评估会识别虚拟中断,一旦识别到虚拟中断,则直接在 VMX non-root 下投递此中断,无需 VM exit。

4.1 虚拟中断的评估[29.2.1]
如下动作会触发(pending 状态的)虚拟中断的评估:VM entry;TPR 虚拟化;EOI 虚拟化;self-IPI 虚拟化;posted-interrupt 处理。其他操作不会触发虚拟中断的评估,即使它们修改了 RVI 或 VPPR。

虚拟中断的评估要用到 guest 中断状态(具体来说,SVI)。

一旦识别到(pending 状态的)虚拟中断,可以直接在 VMX non-root 下投递虚拟中断。

4.2 虚拟中断投递[29.2.2]
如果识别到虚拟中断,则如下情况皆满足的情况下此中断会被投递:(1)RFLAGS.IF = 1;(2)没有被 STI 阻塞;(3)没有被 MOV SS 或 POP SS 阻塞;(4)“interrupt-window exiting” VM-execution control 为 0。

虚拟中断投递与对 “interrupt-window exiting” VM-execution control 写 1 触发的 VM exit 优先级相同。因此不可屏蔽中断(NMIs)及其他更高优先级事件的优先级比虚拟中断投递的优先级要高;虚拟中断投递的优先级要比外部中断及低优先级事件的要高。

虚拟中断与外部中断一样,会将逻辑处理器从 inactive 状态唤醒。特别地,其会唤醒逻辑处理器使用 HLT、MWAIT 指令所进入的状态。其不会唤醒处于 shutdown 或 wait-for-SIPI 状态的逻辑处理器。

如果逻辑处理器在 enclave 模式,则在投递虚拟中断之前会有一个 Asynchronous Enclave Exit(AEX)。

  1. TPR CR8 访问虚拟化[29.3]
    64 bit 模式下,软件可以通过 CR8 访问 local APIC 的 task-priority register(TPR)。

VMM 可通过设置 VM-execution controls 中的 “CR8-load exiting” 及 “CR8-store exiting” 来虚拟基于 CR8 的 APIC 访问。换句话说,可以在没有 VM exit 的情况下虚拟某些基于 CR8 的 APIC 访问。

通常情况下,执行 MOV from CR8 或 MOV to CR8 而对 APIC TPR 的访问,不会触发异常或 VM exit。但是,如果 “use TPR shadow” VM-execution control 为 1,会做如下特殊处理:

MOV from CR8:该指令将 VTPR 的 bits 7:4 加载到其目标操作数的 bits 3:0(Section 29.1.1)。 目标操作数的 bits 63:4 被清除。
MOV to CR8:该指令将其源操作数的 bits 3:0 存储到 VTPR 的 bits 7:4;VTPR 的其余部分(bits 3:0 和 bits 31:8)被清除。 随后,处理器执行 TPR 虚拟化(Section 29.1.2)。
6. APIC MMIO 访问虚拟化[29.4]
xAPIC 模式下通过 MMIO 访问 local APIC 的控制寄存器。具体来说,软件使用 IA32_APIC_BASE MSR 中的线性地址来访问页框物理地址。

VMM 可以通过确保对这些线性地址的访问,都访问到的是 local APIC 而不是触发 VM exit,来实现 APIC MMIO 访问的虚拟化。这可以通过使用分页或 extended page-table 机制(EPT)做到。另一种手法是将 “virtualize APIC accesses” VM-execution control 置 1。

如果 “virtualize APIC accesses” VM-execution control 为 1,逻辑处理器会对被翻译为 4KB APIC-access page 物理地址的线性地址访问做特殊处理(APIC-access page 由 VMCS 中的 APIC-access address 域指定,Section 24.6.8)。

原注:

  1. 即使通过 EPT 做地址翻译(Section 28.2),一个 APIC 访问到底会不会触发 VM exit 取决于 HPA,而不是 GPA。即使 CR0.PG = 0(译者注:不开启分页机制),软件做普通内存访问时依然使用线性地址。实际上,CR0.PG = 0 的本质是,线性地址与物理地址(或 guest 物理地址)是一一映射的。

  2. 如果使能 EPT,且一个写操作的 GPA 被翻译成,具有 sub-page 写入权限的 APIC-access page 的地址(Section 28.2.4.1),则处理器对此写入的处理如同 “virtualize APIC accesses” VM-execution control 为 0 的场景(且不会采用本节所述的处理流程)(译者注:写权限破坏了 “virtualize APIC accesses” 为 1 时的语义)。介于此,软件不应对任意会翻译成 APIC-access page 地址的 GPA 配置 sub-page 写权限。

通常来说,对 APIC-access page 的访问会触发 APIC-access VM exit。APIC-access VM exit 为 VMM 提供了 VM exit 信息。

通过配置 VM-execution controls 可以让处理器在虚拟特定的 APIC-access page 操作时不 VM exit。通常来说,处理器对这些操作的虚拟,是让这些操作访问 virtual-APIC page 而非 APIC-access page。

注意:

除非特别声明,本节仅描述对 APIC-access page 访问的线性地址;一个 APIC-access page 的线性访问满足:(1)其实一个使用线性地址的内存访问;(2)此访问的物理地址是该线性地址的翻译。Section 29.4.6 讨论了 APIC-access page 访问的非线性访问。
对 APIC-access page(译者注:由 VMCS 中的 APIC-access address 域指定) 和 virtual-APIC page(译者注:virtual-APIC page 的物理地址为 virtual-APIC address,是 VMCS 中的一个 64 bit VM-execution control 域。)进行区分的好处是,VMM 可以在 VM 的多个 VCPU 之间共享页表或 EPT 页表(共享页表指向同一个 APIC-access 地址,该地址在所有 VCPU 的 VMCS 中),但每个 VCPU 又有其自己的 virtual APIC(每个 VCPU 的 VMCS 都有一个与众不同的 virtual-APIC address)。译者注:VMM 可以为每个 VCPU 分配不同的 virtual-APIC page,通过 VMCS 告知处理器,VCPU 通过线性地址访问到 APIC-access page 时,会被处理器自动重定向到 virtual-APIC page。
本节使用了“operation”的概念,一个 operation 是引发内存访问的操作。“operation” 可以是一个 REP 前缀指令的 iteration,也可以是其他任意指令,或是通过 IDT 过来的事件。

Intel SGX 指令或处理器处于 enclave 模式时会有特殊处理。

6.1 APIC-access VM exit 优先级[29.4.1]
由内存访问触发的 APIC-access VM exit 的优先级,比该访问触发的 page fault 或 EPT violation 要低(译者注:先处理 page fault,再处理 APIC-access 虚拟化)。也就是说,如果一次访问触发了 page fault 或 EPT violation,则其不会触发 APIC-access VM exit。
在页表(包括 EPT 页表)中的 accessed flags 被置上之后,内存访问才会触发 APIC-access VM exit。
在页表或 EPT 页表中的 dirty flags 被置上之后,内存写访问才会触发 APIC-access VM exit。
相对一个访问可以触发的其他事件来说,由内存访问所触发的 APIC-access VM exit,与该访问所可能导致的 page fault 或 EPT violation 优先级一致(译者注:这里不是说 APIC-access VM exit 与 page fault 优先级一致,而是相对其他可能会触发的事件来说,APIC-access VM exit 与这些事件的相对优先级,等同于 page fault 与这些事件的相对优先级)(该规则同样适用于同一 operation 所触发的其他访问而产生的事件)。
这些规则意味着,一个 repeated string 指令(包括 INs 及 OUTs)可能会触发 APIC-access VM exit。假设,该指令的前 n 次(n 可能为 0)iteration 没有访问 APIC-access page,但是下一个 iteration 会访问此 page。最终结果是,前 n 次 iteration 完成后会跟随一个 APIC-access VM exit。VMCS 中所保存的指令指针指向 repeated string 指令,general-purpose 寄存器的值体现的是前 n 次 iteration 的结果。

6.2 APIC-access page 读虚拟化[29.4.2]
如果下列任意条件满足,则 APIC-access page 的读访问会触发 APIC-access VM exit:

“use TPR shadow” VM-execution control 为 0。
访问是为了做指令预取。
访问长度超过 32 bits。
此访问是处理器已经完成了的一个 APIC-access page 写虚拟化的一部分(译者注:没看明白)。
此访问并不完全落在一个 16 字节对齐区域的低 4 字节。也就是说,访问地址的 bits 3:2(译者注:地址的最低字节)为 0,访问地址的最高字节也是这种情况。
如果以上条件没有满足的,则根据 “APIC-register virtualization” VM-execution control 的设置来决定读访问如何虚拟化:

如果 “APIC-register virtualization” 及 “virtual-interrupt delivery” VM-execution control 皆为 0,且读访问的 page offset 为 080H(访问的是 task priority)则其被虚拟化;否则触发 APIC-access VM exit。
如果 “APIC-register virtualization” VM-execution control 为 0 且 “virtual-interrupt delivery” VM-execution control 为 1,且读访问的 page offset 为 080H(访问的是 task priority)、0B0H(访问的是 end of interrupt)、或 300H(访问的是 interrupt command - low)则其被虚拟化;否则触发 APIC-access VM exit。
如果 “APIC-register virtualization” 为 1,且一个读请求地址全部位于如下偏移范围内,则其被虚拟化:
— 译者:不罗列,略。

所有其他场景均触发 APIC-access VM exit。

被虚拟化的 APIC-access page 读访问,其获取到的数据是 virtual-APIC page 中对应 page offset 处的数据。

原注:从 virtual-APIC page 中读访问的 memory type,由 IA32_VMX_BASIC MSR 的 bits 53:50 上报。

6.3 APIC-access page 写虚拟化[29.4.3]
对 APIC-access page 的写访问是否被虚拟化,取决于 VM-execution controls 及访问的 page offset 的设置。

与写不同,对 local APIC 的写是有副作用的(译者注:意思就是会产生实际效应,比如发送一个中断);正因为如此,APIC-access page 的写可能要根据所访问的 page offset(page offset 指定了所要访问的 APIC 寄存器)来做特定的 emulation。Section 29.4.3.2 讨论了这些 APIC-write emulation(译者注:所谓的 APIC-write emulation,就是指 CPU 为让副作用生效而额外做的动作)。

对于有些 page offset,写操作完成后需要由软件来完成虚拟化。这些场景下,处理器会触发 APIC-write VM exit 以给到 VMM。

6.3.1 确定一个写访问是否被虚拟化[29.4.3.1]
译者:这一节类似 29.4.2,罗列了在哪些情况下哪些写访问是会被虚拟化的,哪些是退出的。不罗列,略。

6.3.2 APIC-write emulation[29.4.3.2]
如果处理器虚拟对 APIC-access page 的写访问,则其需要在 operation 完成之后再做一些额外的动作。这些额外的动作称为 APIC-write emulation。

APIC-write emulation 的具体细节取决于被虚拟的写访问的 page offset:

译者:不罗列,略。
APIC-write emulation 的优先级高于 system-management interrupts(SMIs)、INIT 信号以及 lower priority 事件。RFLAGS.IF = 0 或 MOV SS、POP SS、STI 指令皆无法阻塞 APIC-write emulation。

6.3.3 APIC-write VM exits[29.4.3.3]
特定场景下,VMM 必须介入对 APIC-access page 写访问的虚拟。这些场景下,APIC-write emulation 将触发一个 APIC-write VM exit。

APIC-write exit 的退出原因为 “APIC write”。退出信息是导致 VM exit 的写访问的 page offset。

6.4 特定指令情况[29.4.4]
有些指令会带上一个线性地址作为操作数,即使这些指令不使用这些线性地址来访问内存,但它们仍然可能触发缺页。APIC 虚拟化对这些指令也有影响:

CFLUSH,CFLUSHOPT:处理器对由此触发的异常的处理,如同这些指令用操作数中的线性地址在做读访问。如果该地址翻译后为一个 APIC-access page 上的地址,该指令会触发 APIC-access VM exit,否则,则处理器 flush 掉 virtual-APIC page 中的 cache line,而不是 APIC-access page 的。
ENTER:
MASKMOVQ 与 MASKMOVDQU:
MONITOR:
PREFETCH:
APIC-access page 访问虚拟化原则上是针对诸如 AND、MOV、OR、TEST、XCHG 及 XOR 之类的基本指令。通常操作的是浮点、SSE、AVX 或 AVX-512 寄存器的指令可能会触发意外的 APIC-access VM exit,不论其所要访问的 APIC-access page 的 page offset 是多少。

6.5 page size 及 TLB 管理相关问题[29.4.5]
只有当 APIC-access 地址翻译使用的都是 4KB 页时,“virtualize APIC accesses” VM-execution 为 1 的设置才能生效。具体细节:

未使用 EPT 的情况下,任意被翻译成 APIC-access page 内地址的线性地址,必须使用 4KB 页。如果使用了更大的页,其行为等同 “virtualize APIC accesses” VM-execution control 为 0 的情况。
使用 EPT 的情况下,任意被翻译成 APIC-access page 内地址的 GPA,必须使用 4KB 页。任意翻译成 GPA 的线性地址,如果 GPA 进一步翻译成使用更大页的 APIC-access page,则对该线性地址的访问行为等同 “virtualize APIC accesses” VM-execution control 为 0 的情况(对于使用 GPA 来访问 APIC-access page 的场景同样适用)。
另外,软件在进行可能对 APIC 虚拟化产生影响的修改后,应当进行恰当的 TLB invalidation。具体细节取决于是否使用了 VPIDs 及 EPT:

使用了 VPIDs 但未使用 EPT:
使用了 EPT:
VPIDs 及 EPT 皆未使用:
恰当的 TLB invalidation 失败时,逻辑处理器对受影响地址访问的处理,就如同 “virtualize APIC accesses” VM-execution control 为 0 的场景。(VPIDs 及 EPT 皆未使用的情况下无需 invalidation。)

6.6 非直接由线性地址访问所引发的 APIC 访问[29.4.6]
Section 29.4 描述了对使用“翻译成 APIC-access page 地址的线性地址”的访问的处理。本节讨论并非直接由线性地址所引发的内存访问的处理。

译者:太 specific 了,略。

6.6.1 APIC-access page 的 guest 物理地址访问[29.4.6.1]
略。

6.6.2 APIC-access page 的物理地址访问[29.4.6.2]
略。

  1. APIC MSR 访问虚拟化[29.5]
    x2APIC 模式下通过 MSR 访问 local APIC。具体来说,软件将 ECX(指定所要访问的 MSR)设置为范围在 800H-8FFH 的值,并调用 RDMSR 及 WRMSR 指令。本节讨论如何对这些访问进行虚拟化。

VMM 可以通过配置 MSR bitmaps(Section 24.6.9)使得这些访问都触发 VM exit,来对 APIC MSR 访问做虚拟化。另外,还有一些手法可以在不 VM exit 的情况下虚拟化 APIC MSR 访问。

通常来说,RDMSR 或 WRMSR 访问 ECX 所指定的 MSR 时并不会触发异常或 VM exit。但是 “virtualize x2APIC mode” VM-execution control 为 1 时,800H-8FFH 范围内的有些值会被特殊对待。细节如下:

RDMSR:此指令的行为取决于 “APIC-register virtualization” VM-execution control。
— 如果 “APIC-register virtualization” VM-execution control 为 0,则行为取决于 ECX 的值:

如果 ECX 是 808H(也就是 TPR MSR),该指令从 virtual-APIC page 的 080H 偏移处读取 8 个字节(VTPR 以及更高地址处的 4 个字节)到 EDX:EAX。即使 local APIC 并非 x2APIC 模式亦然(因为 local APIC 不在 x2APIC 模式下,故而不会有 general-protection 异常)。
如果 ECX 是 800H-8FFH 范围内的任意其他值,该指令正常执行。如果 local APIC 在 x2APIC 模式,且 ECX 指向一个可读 APIC 寄存器,则 EDX 及 EAX 会读取该寄存器的值。如果 local APIC 不在 x2APIC 模式下,或 ECX 指向的不是一个可读 APIC,则触发 general-protection 异常。
— 如果 “APIC-register virtualization” VM-execution control 为 1,且 ECX 的值在 800H-8FFH 范围内,则指令将 virtual-APIC page 偏移 X 处的 8 字节读进 EDX:EAX,其中 X = (ECX & FFH) << 4。即使 local APIC 并非 x2APIC 模式亦然(因为 local APIC 不在 x2APIC 模式下,故而不会有 general-protection 异常)。

WRMSR:该指令的行为取决于 ECX 及 “virtual-interrupt delivery” VM-execution control 的设置。
— 译者注:类似 RDMSR 的 specific 的东西,不罗列。

  1. posted-interrupt 处理[29.6]
    对 posted-interrupt 的处理就是处理器将虚拟中断记录(pending)到 virtual-APIC page。

通过设置 “process posted interrupt” VM-execution control 来使能 posted-interrupt 处理。具体处理是对一个 posted-interrupt notification vector 中断进行响应。为响应该类中断,处理器将虚拟中断记录到一个称为 posted-interrupt descriptor 的数据结构中。posted-interrupt notification vector 及 posted-interrupt descriptor 的地址都记录在 VMCS 中;见 Section 24.6.8。

如果 “process posted interrupts” VM-execution control 为 1,逻辑处理器会使用一个位于 posted-interrupt descriptor 地址处的 64 字节 posted-interrupt descriptor。posted-interrupt descriptor 格式如下:

PIR(posted-interrupt requests)指代的是 posted-interrupt descriptor 中的 256 个 posted-interrupt bits。

posted-interrupt descriptor 的用法不同于由 VMCS 中指针所指向的其他数据结构。通常来说,软件需要确保所有企图修改这些数据结构(译者注:非 posted-interrupt descriptor 的数据机构)的逻辑处理器必须在 root 模式下。此要求对 posted-interrupt descriptor 不成立。对 posted-interrupt descriptor 的修改通过 locked read-modify-write 指令完成。

如果 “execution-interrupt exiting” VM-execution control 为 1,没有被 mask 的外部中断将导致 VM exit(Section 25.2)。如果 “process posted interrupts” VM-execution control 也为 1,则该行为将有不同,处理器按如下规则处理外部中断:

译者:太 specific,不翻了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值