登录后台

页面导航

本文编写于 396 天前,最后修改于 396 天前,其中某些信息可能已经过时。

GICV3 virtualization

ARMV8-A架构中包含了对虚拟化的支持。为了与架构保持匹配,GICV3也对虚拟化做了支持。新增了以下特性:

  • 对CPU interface的硬件虚拟化
  • 虚拟中断
  • maintenance 中断

GIC架构不提供对gicd、gicr和ITS部件的虚拟化。对于这些接口的虚拟化必须通过软件来进行处理。

CPU Interfaces

CPU interfaces被分为了三个部分:

  • 物理的CPU接口寄存器
  • 虚拟化控制寄存器
  • 虚拟的CPU接口寄存器

8833070E-CB91-4AEA-BFE1-90C309072FFA.jpeg

  • physical CPU interface

    执行在EL2的管理程序可以通过ICC_*_ELn寄存器对物理中断进行处理

  • virtualization control

    管理程序可以访问额外的寄存器,用于控制架构提供的虚拟化特性,包括:

    • 使能/关闭virtual CPU interface
    • 访问虚拟寄存器状态用于进行上下文的切换
    • 配置maintenance中断
    • 控制虚拟中断

    这些寄存器控制的是它们能够访问的物理PE的虚拟化特性,不能访问其他PE的状态(执行在PE X上的软件不能访问PE Y的状态)

  • virtual CPU interface

    执行在虚拟环境中的软件通过ICV_EL1寄存器对中断进行处理。这些寄存器与ICC_EL1寄存器有着相同的形式与功能。

    ICV寄存器和ICC寄存器的instruction encoding都是相同的。在EL2、EL3和安全EL1状态下,往往使用的是ICC寄存器。在非安全EL1状态下,使用ICC寄存器还是ICV寄存器是由HCR_EL2寄存器(FMO、IMO字段)来决定的。

管理虚拟中断

执行在EL2的管理程序可以通过ICH_LR_EL2(list register)这一组寄存器来产生虚拟中断。每一个寄存器代表了一个虚拟中断,并记录了以下信息:

  • virtual INTID
  • state(pending、active、active&pending、inactive)
  • group(group0、group1s、group1ns)
  • pINTID(虚拟中断可以选择与物理中断绑定起来,两者的状态机会同步更新)

DAAC5D05-7D80-4594-9D15-AC185BCCF048.jpeg

当一个物理中断被转发给vPE时会发生以下步骤:

  1. gicr将一个物理的非安全group1中断转发到物理的CPU interface上
  2. CPU interface检查该中断是否能被转发至PE上
  3. 该中断被在EL2进行处理。管理程序读IAR寄存器,并决定是否将其转发到vPE上。然后写EOIR寄存器。当ICC_CTLR_EL1.EOImode == 1时,写EOIR寄存器这个操作,只会执行优先级下降,而不会deactive这个物理中断。详细内容查看物理中断的生命周期。
  4. 管理程序写上述提到的LIST 寄存器来产生一个虚拟中断。该虚拟中断与物理中断绑定在了一起。然后管理程序进行异常返回。
  5. 虚拟CPU interface检查该虚拟中断是否能被转发到vPE上。除了使用ICV寄存器之外,这些检查与物理中断的检查是相同的。
  6. 这个虚拟中断会被带到非安全的EL1状态。当软件读取IAR寄存器时,该虚拟中断进入active态。
  7. 执行在非安全EL1的软件对该中断进行处理。当其处理完成后,写EOIR寄存器。因为该虚拟中断与物理中断绑定在了一起,所以虚拟中断会和物理中断一起进入deactive状态,结束整个中断处理。

Maintenance Interrupt

可以配置CPU interface,在当虚拟的CPU interface满足一定条件时产生一个物理的中断。这个中断会被上报为中断号为25的PPI中断。这个中断一般会被配置为非安全group1类型的中断,并且由执行在EL2的管理程序进行处理。

维护中断的生成是由ICH_HCR_EL2进行控制的,并且该类型的中断触发会在ICH_MISR_EL2寄存器报告。

例如:当vPE把虚拟CPU interface上的group0中断的使能位给清零了,就会产生一个维护中断。看到这个中断之后,管理程序可以清除list register上所有处于pending状态的group0中断。