导图社区 Vol3-29-APIC虚拟化和虚拟中断
Virtualize APIC Accesses 功能可以单独开启,此时它的作用仅仅是将Guest APIC访问的VM Exit从EPT Violaton改为了APIC Access,对Guest的APIC访问仍需要以Trap-and-Emulate方式实现。
编辑于2022-09-16 17:12:51 上海Virtualize APIC Accesses 功能可以单独开启,此时它的作用仅仅是将Guest APIC访问的VM Exit从EPT Violaton改为了APIC Access,对Guest的APIC访问仍需要以Trap-and-Emulate方式实现。
VMCS 的数据区包含了VMX配置信息:VMM在启动虚拟机前配置其哪些操作会触发VMExit。VMExit 产生后,处理器把执行权交给VMM 以完成控制,
系统软件可以通过CPUID指令来判断处理器是否支持VMX,如果CPUID.1.ECX.VMX[bit5] = 1,那么当前处理器支持VMX,否则,当前处理器不支持VMX功能。
社区模板帮助中心,点此进入>>
Virtualize APIC Accesses 功能可以单独开启,此时它的作用仅仅是将Guest APIC访问的VM Exit从EPT Violaton改为了APIC Access,对Guest的APIC访问仍需要以Trap-and-Emulate方式实现。
VMCS 的数据区包含了VMX配置信息:VMM在启动虚拟机前配置其哪些操作会触发VMExit。VMExit 产生后,处理器把执行权交给VMM 以完成控制,
系统软件可以通过CPUID指令来判断处理器是否支持VMX,如果CPUID.1.ECX.VMX[bit5] = 1,那么当前处理器支持VMX,否则,当前处理器不支持VMX功能。
APIC虚拟化和虚拟中断
概述:VMCS对APIC和中断虚拟化的支持
VMCS包含能够使能APIC虚拟化和中断虚拟化的Control,使用这些control,处理器可以模拟很多对APIC的访问,也可以追踪虚拟APIC的状态,也可以deliver虚拟中断,而这一切,都不需要vmexit.
track APIC 功能
处理器使用由VMM identified的virtual-APIC page来track 虚拟APIC的状态。
相关VMCS filed
Virtual-Interrupt Delivery
使能pending virtual Interrupts的评估和delivery
也使能向APIC 中断优先级寄存器写的模拟
Use TPR Shadow
使能通过CR8访问APIC的TPR的模拟,访问形式为memory mapped的形式或MSR-based的形式,即rdmsr/wrmsr
Virtualize APIC Access
使能通过memory mapped访问APIC这个过程的虚拟化,虚拟化的方式为在访问一个VMM指定的APIC-access page的时候vmexit。
Virtualize x2APIC Access
使能通过MSR-based的形式(即rdmsr,wrmsr)访问APIC
APIC Register Virtualization
使能通过memory mapped的形式或MSR-based的形式读大多数APIC寄存器,方法为从virtual APIC-page中获取这些信息。还将通过memory mapped的形式写APIC-access page的动作重定向到写virtual APIC-page,然后vmexit到VMM中处理写到virtual APIC-page的行为。
process posted Interrupts
允许软件将一个中断放在一个结构体中,然后给目标逻辑核发送一个notification,目标逻辑核一旦收到这个notification,立即将中断复制到virtual-APIC page中处理。
所有这些VMCS control都为secondary processor based VM-execution control,如果primary processor based VM-execution control的bit31为0,那么这些control肯定均为0.
29.1 虚拟APIC状态
Virtual-APIC page是处理器用于虚拟化对特定APIC寄存器的访问,以及管理虚拟中断的page,4k大。这个Virtual-APIC page的地址在VMCS的VM-execution field中,64bit.根据某些VM-execution controls的设置,处理器可以使用类似于Local APIC执行的功能来虚拟化virtual-APIC页面上的某些字段。
虚拟出来的APIC寄存器
可以根据vm-execution的设定,虚拟化出部分APIC寄存器。
VTPR(virtual task priority register). Virtual-APIC page的offset 0x80处
VPPR(virtual processor-priority register). Virtual-APIC page的offset 0xA0处
VEOI(virtual end-of-interrupt register). Virtual-APIC page的offset 0xB0处
VISR(virtual interrupt-service register). 由8个非连续的32bit field组成,分别在Virtual-APIC page的offset 0x100,0x110,0x120,0x130,0x140一直到0x170处.VISR的bitx可以利用特定寻址方法在这些内存中寻址。处理器只使用这8个offset地址的低4字节。
VIRR(virtual interrupt-request register). 与VISR类似,使用offset 0x200,0x210一直到0x270.寻址方法也同样给定,也只是用这8个地址空间的低4字节。
Virtual Interrupt Command Registers. 该寄存器分为高32bit和低32bit,分别位于Virtual-APIC page的0x310和0x300处。
虚拟出来的APIC寄存器的作用
TPR的虚拟化
MOV to CR8动作的虚拟化
向APIC-access page offset 0x80写动作的虚拟化
当ECX=0x808时,WRMSR指令的虚拟化
如果VTPR小于TPR阈值,就会导致vmexit,这种vmexit是trap-like的,即在vmexit发生之前,导致vmexit的指令会执行完成,而不是中断。
PPR的虚拟化
VMENTRY时的相关虚拟化
TPR虚拟化
EOI虚拟化
PPR的虚拟化总是clear bytes3:1 of VPPR
PPR的虚拟化只会由TPR、EOI的虚拟化,以及vmentry导致。传输中断会以另一种方式修改VPPR。没有其它任何方式修改VPPR,即使修改了SVI、VISR、VTPR,也不会修改VPPR。
PPR的虚拟化会使用和更新Guest中断状态。
EOI的虚拟化
对APIC-access page的0xB0写操作时的虚拟化
当ECX=0x80B时,WRMSR指令的虚拟化
EOI的虚拟化只有在control:“virtual-interrupt delivery”时发生。
EOI会导致vmexit,而且该vmexit为trap-like,即在exit之前会完成正在执行的指令而不是中断。
EOI的虚拟化会使用和更新Guest中断状态。
Self-IPI的虚拟化
对APIC-access page的0x300写操作时的虚拟化
ECX=0x83F时的WRMSR指令的虚拟化
self-IPI的虚拟化只有在contrl:"virtual-interrupt delivery"为1时才会有效。
每个导致Self-IPI虚拟化的操作都提供一个8-bit的Vector,self-IPI虚拟化会更新Guest中断状态。
29.2 虚拟中断的评估和递交
如果“virtual-interrupt delivery” control为1,non-root下或vmentry时的特定操作会导致处理评估和递交虚拟中断。
中断评估
由特定动作触发,途径为修改virtual-APIC page的内容,结果为使处理器认为自己收到了一个中断。处理器收到模拟中断后,会直接在non-root下操作,不会vmexit.
引起pending virtual interrupts evaluation的特定动作
VM entry
TPR virtualization
EOI virtualization
EOI virtualization
self-IPI virtualization
posted-interrupt processing
在递交了virtual Interrupt之后,逻辑处理器停止识别其它pending virtual Interrupt.直到下次以触发中断评估的原因出现。
虚拟中断递交
经过中断评估后,如果处理器识别了一个中断,并且以下条件成立,虚拟中断就会在指令边缘递交中断给处理器。
RFLAGS.IF = 1
没有受STI的阻塞
没有收到POP SS或MOV SS 的阻塞
“interrupt-window exiting” control为0
事件优先级
NMI的优先级高于虚拟中断的提交
虚拟中断的提交优先级高于external interrupts
导致的逻辑处理器状态
虚拟中断的提交和external Interrupt一样,都会将逻辑处理器从inactive状态wake up出来,
虚拟中断提交会将由于HLT或MWAIT指令导致逻辑处理器进入的inactive状态唤醒,但是虚拟中断提交无法唤醒shutdown状态或waiting for SIPI状态的逻辑处理器
虚拟中断提交会更新Guest中断状态(RVI和SVI),并且提交一个事件。
29.6 POSTED-INTERRUPT PROCESSING
posted-Interrupt processing是一个处理器feature,利用该feature,处理器可以通过将virtual Interrupt作为pending Interrupt记录到virtual-APIC page上,来处理virtual Interrupt。
也可以通过set“process posted interrupts” control来使能该posted-Interrupt processing feature。
当中断来临时,posted-Interrupt notification vector就会具有内容,这里的processing是对该中断的来临做出反应。具体反应为,处理器处理记录在“posted-Interrupt descriptor”数据结构中的虚拟中断,posted-Interrupt notification vector和posted-Interrupt descriptor的地址都是VMCS中的field。
如果"process posted interrupts" control为1,处理器会使用一个64个字节的posted-Interrupt descriptor,其地址在VMCS中,posted-Interrupt descriptor 数据结构有以下内容:
bit255:0是posted-Interrupt request field,每个bit对应一个中断vector,如果某bit为1,则证明有一个对中断vector的posted-Interrupt 请求。
bit256是outstanding notification field, 如果该bit为1,说明有一个针对bit255:0中的一个或多个posted Interrupts的未完成通知。
bit511:257,保留field,留给软件或系统中的其它部分使用,处理器不会对该field进行操作。
posted Interrupt descriptor的使用和其它地址在VMCS中的数据结构的使用不太一样。在使用其它数据结构时,软件必须确保,只有在没有逻辑处理器(持有current VMCS的)(引用这些数据结构的)处于non-root mode时,才能修改这些的内容,但 posted Interrupt descriptor的修改没有这种限制, 只有一点点限制在于,如果持有current VMCS,且引用posted Interrupt descriptor的逻辑处理器处于non-root mode时,修改posted Interrupt descriptor需要使用带lock的read-modify-write 指令。
如果"external-interrupt exiting" control为1,任何没有没mask掉的external Interrupt都会导致vmexit,但是,如果“process posted interrupts”control也是1,那么这种行为就会发生变化。处理器就会如下处理External Interrupt。
1. 接管Local APIC,Local APIC为处理器提供了一个中断向量,这里称为physical vector。
2.如果physical vector与posted-Interrupt notification vector一样,则进入下一步,否则就会正常产生vmexit,physical vector存储在vm-exit Interrupt-information field。
3. 处理器clear掉posted Interrupt descriptor中的outstanding notification bit,这会自动进行,以保留descriptor中的其它bit不变(可以使用带lock的AND指令)
4. 处理器向local APIC的EOI寄存器中写0,这会从本地APIC中释放带有posted interrupt notification vector的中断。
确定收到了一个中断,并释放中断
5. 逻辑处理器对PIR和VIRR做逻辑或,然后将结果填入VIRR,并clear PIR。在PIR被读(为了做或运算)之后和被clear之前,没有其它agent能修改任意一个PIR bit,
PIR(posted-Interrupt request)是指posted-Interrupt descriptor中的256个posted Interrupt request bits。
6. 逻辑处理器将RVI设置为旧的RVI与PIR中被set的最大index之间的最大值,如果PIR中没有bit被set,那么就不修改RVI的值。
1. 修改Virtual APIC-page中的VIRR, 2. 更新VMCS的Guest中断状态RVI 3. 评估中断
7.逻辑处理器开始评估正在等待的虚拟中断。如果发现评估发现pending Interrupt,处理器会立即deliver该中断。
左边的step1-7发生在中断控制器向cpu deliver unmasked External Interrupt时发生,下面还有一些中断deliver的特殊情况。
1.中断delivery可能发生在以REP为前缀的循环指令中,即至少在第一个指令之后,且未结束循环。如果发生在此类指令中,在Guest继续执行之前,post-interrupt processing之后,以下几项说明了处理器的实时状态
RIP指向的是以REP为前缀的循环指令
RCX,RSI,RDI指向刚刚完成的某次循环
RFLAGS.RF=1
2. 中断delivery可能发生在处理器处于active、hlt、mwait状态时。如果在中断到达之前,逻辑处理器处于active或mwait状态,那么处理器就是左边的step7之后的状态;如果在中断到达之前,处理器处于HLT状态,那么在step7完成之后,处理器会返回HLT状态(如果处理器发现了一个pending Interrupt,处理器会迅速从hlt状态转换为active状态)。
3. 中断delivery可能发生在处理器处于enclave mode的时候,如果在中断到达之前,处理器处于enclave mode,在step1到step7之前可能会发生AEX,如果step1之前没发生AEX,step2发生了VMEXIT,在该vmexit deliver之前会发生AEX。
29.5 MSR-Based APIC Access的虚拟化
当APIC处于x2APIC mode时,软件使用RDMSR/WRMSR访问APIC的控制寄存器,还会将ECX设置为0x800-0x8FF.
VMM可以通过设置MSR-bitmap确保每一次通过MSR访问APIC control register都导致vmexit。还有其它一些方法,可以virtualize MSR-based APIC access,但不通过vmexit。
正常情况下,RDMSR/WRMSR会选择存储于ECX的index作为目标MSR,但当ECX中的值处于0x800-0x8FF,且virtualize x2APIC mode为1时,就会触发特殊处理:
特殊对待见29.5的RDMSR和WRMSR部分,主要根据2个control的值和处于ECX中的值,引起不同的操作
29.4 memory mapped APIC access的虚拟化
当Local APIC处于xAPIC模式时,软件使用memory mapped地址访问APIC控制寄存器,即可以使用虚拟地址(再转换为物理地址)访问APIC控制寄存器,而APIC各控制寄存器的映射到内存中的页的基地址在IA32_APIC_BASE MSR中
由于这种memory map的访问方式,APIC的访问虚拟化也分为2种方案
1. 利用EPT或分页机制,使对APIC control register所处的内存地址的访问触发vmexit,到VMM中处理
2. 如果“virtualize APIC access”control为1,那么对于访问的线性地址最终翻译到APIC-page中的物理地址的memory access,逻辑处理器会特殊处理。
导致APIC-access vmexit。
当然部分vm-execution control field的设置会导致对特定APIC-access page的访问不会导致vmexit,这部分访问会访问Virtual APIC page而不是APIC-access page.
当设计为给每个虚拟处理器一个virtual APIC时(即每个虚拟处理器的VMCS都有一个独立的virtual APIC address),APIC-access page和Virtual APIC page的区别允许VMM使页表结构或EPT页表结构在一个VM的多个虚拟处理器之间共享(这些页表结构都reference同一个APIC access page,所有虚拟处理器的VMCS中都有该filed,而且一样)
APIC-access vmexit的优先级
APIC-access vmexit的优先级低于本次access导致的page fault或者EPT violation,即如果某access导致了page fault或EPT violation,就不会导致APIC-access vmexit,
直到页表结构或EPT页表结构中的"accessed" flag被set 1,才会发生APIC-access vmexit,
dirty flag与APIC-access vmexit的关系与accessed flag类似
与其它事件相比时,APIC-access vmexit的优先级和其它事件导致的page fault或EPT violation的优先级相同。
这些原则合起来解释了一种情况,就是在一个repeat操作中,前n次操作没有进行APIC-access,而n+1次进行了APIC access,从而导致了n次repeat和一个vmexit,在VMCS的IP field存放了repeat指令,而VMCS的GP field存放的是n次iteration的完成。
从“APIC-access page读”,这一行为的虚拟化
以下任一情况成立,从APIC-access page读都会导致vmexit
1.“use TPR shadow”control为0
2. 该access是为了instruction fetch
3. 该access的size高于32bit
4. 该access是一个操作的一部分,而处理器已经为该操作虚拟化了一个write access to APIC-access page。
5. 该access未完全包含在自然对齐的16字节区域的低4字节内。 也就是说,访问地址的3:2位为0,访问的最高字节的地址也为0。
如果以上任一情况都不成立,从APIC-access page读是否被虚拟化由“APIC-register virtualization”决定
1. 如果该field和“virtual-interrupt delivery”均为0,且APIC-access page read的page offset为0x80,那么该read access就会被虚拟化(无exit)。否则vmexit。
2. 如果该field为0,“virtual-interrupt delivery”为1,且APIC-access page read的page offset为0x80,0xB0,0x300,那么该read access就会被虚拟化,否则vmexit,
如果该field为1,且该read access处于以下范围内,则该access被虚拟化,否则vmexit。

被虚拟化了的APIC-access page读行为,读到的是virtual APIC page的对应offset中的内容
对"APIC-access page 写",这一行为的虚拟化
与读不同,写可能带来副作用,所以需要对APIC-access page的特定offset进行模拟,以防止影响实际APIC的功能
以下任一情况成立,对APIC-access page的写会导致vmexit
1. “use TPR shadow”为0
2. 该access是为了instruction fetch
3. 该access的size高于32bit
4. 该access是一个操作的一部分,而处理器已经为该操作虚拟化了一个write access to APIC-access page。
5. 该access未完全包含在自然对齐的16字节区域的低4字节内。 也就是说,访问地址的3:2位为0,访问的最高字节的地址也为0。
如果以上任一情况都不成立,向APIC-access page写是否被虚拟化由“APIC-register virtualization”和“virtual-interrupt delivery”决定
1. 如果该"APIC-register virtualization"和“virtual-interrupt delivery”均为0,且APIC-access page write的page offset为0x80,那么该write access就会被虚拟化(无exit)。否则vmexit。
2. 如果该"APIC-register virtualization"为0,“virtual-interrupt delivery”为1,且APIC-access page write的page offset为0x80,0xB0,0x300,那么该write access就会被虚拟化,否则vmexit,
如果该"APIC-register virtualization"为1,且该write access处于以下范围内,则该access被虚拟化,否则vmexit。

处理器对“APIC-access page write”的虚拟化,体现为将待写入数据写入virtual APIC page的对应page offset。在该写入动作所属的操作完成之后,处理器还会进行APIC Write Emulation。
APIC-write的模拟
APIC-write的模拟行为取决于Virtualized write access中的page offset
如果page offset为0x80,处理器会clear VTPR的bit3:0,然后进行TPR虚拟化
当page offset为0xB0时,如果“virtual-interrupt delivery”为1,处理器会clear VEOI并且在随后执行EOI虚拟化。如果“virtual-interrupt delivery”为0,处理器会产生一个APIC write vmexit。
当page offset为0x300时,如果"virtual-interrupt delivery"为1,处理器会检查VICR_LO中的值是否满足以下情况,如果满足,那么处理器会利用VICR_LO的byte0中的8bit Vector进行self-IPI虚拟化。
如果"virtual-interrupt delivery"为0,或者VICR_LO的检查条件有任一一项不满足,则产生APIC write vmexit。

当page offset为0x310-0x313时,处理器会clear VICR_HI的bit2:0,不会有相应的vmexit或任何虚拟化产生。
当page offset为其它值时,处理器会产生APIC write vmexit。
APIC write emulation比SMI,INIT信号和其它低优先级事件的优先级高,也不会因为RFLAGS.IF=0或MOV SS,POP SS或STI阻塞。
如果一个fault发生在了write access to APIC-access page之后,APIC-write emulation之前,并且该fault被成功deliver没有产生vmexit,APIC-write emulation会在该fault deliver之后,fault handler执行之前进行。
如果一个导致vmexit的操作,发生在write access to APIC-access page之后,APIC-write emulation之前,那么APIC-write emulation将不会进行。
APIC write vmexit
在APIC-write的模拟中提到了几种情况下,会产生APIC write vmexit,因为需要VMM的参与完成对APIC-write的虚拟化。
APIC write vmexit发生在APIC-write emulation之中,APIC-write emulation发生在一个包含对APIC-access page进行写访问的操作之后,APIC write vmexit是一个trap-like vmexit,即,在包含写访问的操作执行完成之后,该vmexit才会发生。侧面来讲,在vmexit时,VMCS的CS:IP指向的是包含该写访问的操作的指令的下一条指令。
APIC write vmexit的basic reason是"APIC write",exit qualification是导致vmexit的APIC write的page offset.
有一种特殊情况,即当ECX=0x83F时,执行WRMSR指令,如果"virtual-interrupt delivery"为1 ,就会导致APIC-write vmexit,这种情况下的vmexit的exit qualification是0x3F0。
instruction-specific consideration
部分使用线性地址的指令可能会导致page fault,即使这些指令并没有使用这些线性地址访问memory,APIC 虚拟化feature也会影响这些指令
29.4.4
关于page-size和TLB management的一些注意事项
无论EPT是否被使用,如果被访问的地址经过层层翻译最终落到APIC-access page上,那么一定要使用4KB page,使用更大的page大小会等同于认为"virtualize APIC accesses"为0
在进行TLB invalidation时,如果该invalid最终会影响到APIC-access page,需要特别注意,需要注意的点是是否使用VPID和EPT。
如果不能使用正确的指令invalid TLB,那么当access 相关地址时,处理器就会运行得看起来像“virtualize APIC accesses”为0一样,
如果只使用VPID不使用EPT
In that case, software should execute INVVPID (see “INVVPID— Invalidate Translations Based on VPID” in Section 30.3) before performing on the same logical processor and with the same VPID. 在什么case下呢?VPID正在或之前被使用,且软件做了以下操作:
将“virtualize APIC accesses”从之前的0改为了1
通过修改paging structures,将之前没有翻译到APIC-access page上的地址翻译到了APIC-access page上
使用EPT
In that case, software should execute INVEPT (see “INVEPT— Invalidate Translations Derived from EPT” in Section 30.3) before performing on the same logical processor and with the same EPTP value. 在什么case下呢?EPTP被使用,且软件做了以下操作:
将“virtualize APIC accesses”从之前的0改为了1
通过修改EPT paging structures,将之前没有翻译到APIC-access page上的地址翻译到了APIC-access page上
EPT和VPID都没有使用
无需做TLB invalidation(如果EPT和VPID都没有使用,必须不能做TLB invalidation)
不直接由线性地址访问的APIC Access
2个概念
guest-physical access
physical access
Guest physical access对APIC-access page的访问
翻译线性地址时从Guest paging structure中读取
该访问使用非线性地址翻译的guest-physical address
当处理器使用PAE paging时,使用MOV to CR将PDPT entry 载入时
当使用线性地址时,更新guest paging structure中的accessed和dirty flags
该访问使用非线性地址翻译的guest-physical address
当“Intel PT uses guest physical addresses” control为1时,IPT对memory的访问
Guest physical access包含的情况
此类访问总是会导致APIC access vmexit,不论被访问的APIC-access page的page offset为多少
一次Guest physical访问导致的vmexit优先级低于此次访问导致的EPT violation
一次Guest physical访问导致的vmexit优先级与其它Guest physical access导致的EPT violation优先级一样
physical access对APIC-access page的访问
如果“enable EPT”为0
翻译线性地址时从paging structure中读取
当处理器使用PAE paging时,使用MOV to CR将PDPT entry 载入时
更新paging structure中的accessed或dirty flags时
如果“enable EPT”为1,对EPT paging structure的访问(包括对accessed和dirty flags的访问)
对VMCS Region的访问
访问由VMCS vm-execution control中的某filed指向的数据结构,有:the I/O bitmaps, the MSR bitmaps, and the virtual-APIC page.
影响进出SMM的access
Accesses to SMRAM during SMI delivery and during execution of RSM.
Accesses during SMM VM exits (including accesses to MSEG) and during VM entries that return from SMM.
physical access to APIC-access page可能也可能不导致APIC-access vmexit。如果不导致,该access会访问APIC-access page或virtual APIC page。 physical write access to APIC-access page可能也可能不导致APIC-write emulation or APIC-write VM exits.
physical access 导致的vmexit没有设定优先级。
不建议软件使用physical memory address作为APIC access address,如,当"enable EPT"为0时,不应该将APIC-access address设为任何active paging structure的物理地址。
29.3 基于CR8的TPR Access的模拟
在64位模式下,软件可以通过MOV to CR8或MOV from CR8对Local APIC的TPR寄存器进行访问,而对于该行为的虚拟化,VMCS相关field提供了对应的vmexit,使Guest执行这些指令时vmexit,再由VMM软件处理.部分访问CR8寄存器的行为也可以不用vmexit达到虚拟化的效果。
一般而言,正常的(即不导致vmexit,也没有fault)的MOV to/from CR8会访问APIC的TPR,当然,如果“use TPR shadow” control为1,那么这样的操作会被特殊处理。
特殊处理
MOV from CR8
将目标操作数的bit3:0以VTPR的bit7:4代替,目标操作数的bit63:4会被清0
MOV to CR8
将源操作数的bit3:0放到VTPR的bit7:4,VTPR的其它bit会被清0,这之后,处理器开始进行TPR虚拟化,