2. Local APIC虚拟化
每个逻辑处理器都有自己的local APIC组件. 当guest读取local APIC寄存器时, 将返回物理的local APIC寄存器值. 同样, 当guest写local APIC寄存器时, 也将写入物理的local APIC寄存器.
监控guest访问local APIC
local APIC虚拟化机制
前面一节介绍的local APIC虚拟化原理是使用EPT映射机制或MSR bitmap机制来监控guest访问local APIC页面, 并模拟写入和读取local APIC寄存器.
VMX引进了原生的local APIC虚拟化机制, 由VMCS的secondary processor-based VM-execution control字段提供下面的功能.
- Virtualize APIC accesses(虚拟化APIC访问). 当"virtualize APIC accesses"位(bit 0)为1时, 将启用APIC-access page页面. 处理器虚拟化guest线性访问APIC-access page页面的行为, 取决于"APIC-register virtualizaion"位的设置, 产生两种结果:
- 产生APIC access VM-exit, 或者APIC write VM-exit(见7.2.8).
- 成功访问virtual-APIC page页面的数据, 或者虚拟化某项操作(比如EOI虚拟化).
- Virtualize x2APIC mode(虚拟化x2APIC模式).
- Use TPR shadow(启用TPR影子).
- APIC-register virtualization(APIC寄存器虚拟化).
- Virtua-interrupt delivery(虚拟中断的提交).
- Posted-interrupt processing(通告的中断处理).
APIC-access page
虚拟化x2APIC MSR组
virtual-APIC page
APIC-access VM-exit
local APIC虚拟化操作
虚拟中断的评估与delivery
posted-interrupt处理
posted-interrupt processing(通告中断处理)在较早处理器并不支持. VMM通过检查Pin-based VM-execution control字段的"process posted interrupts"位(bit 7)是否允许设为1来检查处理器是否支持(见2.5.6.1).
posted-interrupt(直译为"通告中断")是指VMM张贴出来给guest进行处理的虚拟中断. guest收到一个通知(向量号为notification vector的外部中断)后, 将张贴的通告中断请求列表!!! 复制到virtual-APIC page!!!页面的VIRR里, 从而更新虚拟中断请求列表, 然后进行虚拟中断的评估与delivery.
启用posted-interrupt处理机制
posted-interrupt的通知向量号
VMM需要在posted-interrupt notification vector字段里提供一个通知向量号(见3.5.13). 那么, local APIC接收到的这个外部中断可被成为"通知中断", 其作用是通知guest进行posted-interrupt的处理.
在guest!!! 中, 当local APIC收到外部中断请求时, 处理器检查这个外部中断请求的向量号与notification vector
(通知向量号)是否相等(即检查是否为通知中断). 相等则将posted-interrupt
描述符内的PIR请求列表复制到VIRR, 形成新的虚拟中断请求列表, 然后执行virtual-interrupt
的评估与delivery操作. 如图7-8.
当外部中断向量号不等于notification vector时, 则产生VM-exit. 由于"