介绍

GIC 功能

  • 为管理中断资源、中断行为进行注册,并对中断进行路由。
  • 支持 ARM 安全扩展、虚拟化扩展
  • 启用、禁用来自硬件的中断
  • SGI(软件中断)
  • 中断掩码和优先级设置
  • 在电源管理环境中产生唤醒事件。

    GIC 分组

  • 将每个中断配置为组 0 或者组 1。
  • 将组 0 的中断以 IRQ 或者 FIQ 的形式发到处理器。
  • 将组 1 的中断以 IRQ 的形式发送到处理器。
  • 以一个统一的表来处理组0组1中断的优先级。
  • 对组0的某些中断可以锁定。

    在许多 ARM 架构的实现中,IRQ 和 FIQ 中断请求对应于 IRQ 和 FIQ 异步异常。

    GIC 安全支持

    对于实现了安全扩展的处理器:
  • 组 0 中断为安全中断、组 1 中断为非安全中断。
  • 处理器对 GIC 寄存器的访问分为安全与非安全。
    • 非安全访问只能读写控制非安全中断的寄存器。
    • 安全访问可以读写任意寄存器。
  • 安全系统软件单独将每个已实施的中断定义为安全和非安全。

    GIC 虚拟化支持

    支持对于虚拟中断的处理,降低 Hypervisor 路由中断到虚拟机的开销。

    术语介绍

    中断状态

  • Inactive: 中断是未触发或者不在等待被处理。
  • Pending: 中断已经被触发,等待目标处理器处理。
  • Active: 中断已经被目标处理器确认,正在处理中。
  • Active and pending:中断正在被目标处理器处理,与此同时有一个一样的中断等待被处理。

    中断类型

    外设中断

  • PPI:私有外设中断,需要指定处理器处理的中断。
  • SPI:共享外设中断,可以被指定的一组寄存器处理的中断。

    外设中断在电平上分为两种:

    1. 边沿触发:上升沿触发,一直保持中断触发状态直到被处理。
    2. 电平触发:在高电平时触发,要么被处理、要么回到低电平则撤销中断触发。

    软件中断

  • 通过软件写 GICD_SGIR 寄存器触发。用来进行核间通信。
  • 软中断的触发属性和边沿触发一致。
  • 当 SGI 软件中断触发时,通过 GICC_IAR 或者 GICC_AIAR 识别请求中断的处理器 ID。

    对于实现了虚拟扩展的GIC:

    1. SGI 发生时,在 GIC 虚拟扩展中的管理寄存器将允许将请求中断的CPU报告给虚拟机。
    2. 通过写管理寄存器,Hypervisor可以产生一个在虚拟机表现为SGI的虚拟中断。

    虚拟中断

    发给某一个运行在处理器上的虚拟机的中断。

    维护中断

    一个电平触发的中断,来揭示关键事件,例如一组中断被启用了。

    中断模型

    1-N 模型

    中断发给多个处理器,但只需要一个处理器处理。

    N-N 模型

    中断发给多个处理器,每个处理器都要处理这个中断。

    虚假中断

    在 GIC 将中断分发给 CPU 后,此中断不再被需要是可能的。所以在 CPU 确认此中断时,GIC 将会返回一个特殊的中断ID表面此中断是一个虚假中断。

    Banking

  • 中断 Banking:一组中断在GIC表现为同一个中断号,通过中断号和关联CPU进行区分。
  • 寄存器 Banking: 同一地址存在多个复制体寄存器。