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.

2. Local APIC虚拟化

当外部中断向量号不等于notification vector时, 则产生VM-exit. 由于"