ARM GIC:通用中断控制器的简要介绍

参考文档:

Documentation – Arm Developer 
ARM Generic Interrupt Controller Architecture Specification

目录

 一,GIC的作用 

二,GIC的组成

二,中断状态 Interrupt states

三,中断类型

1,软件中断Software Generated Interrupt (SGI)

2,外设中断(Peripheral interrupt)

Private Peripheral Interrupt (PPI)

Shared Peripheral Interrupt (SPI)

Edge-triggered

Level-sensitive

四,中断配置Configuration

五,中断初始化 Initialization

六,中断处理 handling


ARM提供了一个可用于ARMv8-A系统的通用中断控制器GIC,这个中断控制器的编程接口在GIC架构中定义。通用中断控制器(GIC)支持多核系统中cores之间由软件生成(SGI)、私有(PPI)和共享外设(SPI)中断的路由。

GIC架构还提供了可用于管理中断源和行为的寄存器,以及(在多核系统中)将中断路由到各个core的寄存器。它使软件能够屏蔽、启用和禁用来自单个源的中断,对单个中断源(在硬件上)进行优先级排序,并生成软件中断。GIC接受在系统级别断言的中断,并可以向它所连接的每个core发出信号,可能导致IRQ或FIQ异常。

 一,GIC的作用 

GIC可用于ARM A系列和R系列的单core或者多core的架构,在至少1个core的系统中管理中断,它支持:

  1. 有相关寄存器来管理中断源(interrupt sources),中断行为(interrupt behavior)以及中断路由(interrupt routing)
  2. ARM 架构的安全扩展
  3. ARM架构虚拟化扩展(实现ARM虚拟化扩展的处理器也必须实现ARM安全扩展)
  4. 从硬件(外设)中断源中,使能、禁止以及产生处理器中断
  5. 软件生成中断(SGI)
  6. 中断屏蔽以及优先级
  7. 支持单核和多核环境
  8. 在电源管理环境(power-management environments)中被事件唤醒

二,GIC的组成

GIC主要有两大功能模块,分发器(Distributor)和CPU接口(CPU Interface):

  • 分发器(Distributor):系统中的所有中断源都与之相连接。Distributor有寄存器可以控制每个中断的属性,比如优先级、状态、安全状态、路由信息以及使能状态等。Distributor通过连接的CPU interface,可以决定将哪个中断转发到指定的core中。
  • CPU接口(CPU interface):core通过CPU interface来接收中断,CPU interface通过寄存器来屏蔽、确认以及控制转发到指定core的中断。在系统中每个core有个独立的CPU interface。
  • 在软件层面,中断由一个称为中断ID的数字标识。中断ID与中断源一一对应,软件可以使用中断ID来识别中断的来源,并调用相应的处理程序来为中断提供服务。此外,显示给软件的确切中断ID是由系统设计决定的。

    二,中断状态 Interrupt states

    以下状态适用于GIC和连接的处理器之间的每个接口:

    Inactive(非活跃) 不是活动的或挂起的中断,这意味着当前还没有断言(assert)中断。
    Pending(挂起) 已经被断言(asserted),但是等待core进行处理。挂起的中断将会被转发到CPU interface,然后会被core进行处理。
    Active(活跃) 该中断已被core确认,正在处理,但尚未完成。
    Active and pending(活跃并挂起) 一个core正在处理中断,而GIC有一个来自同一源的挂起的中断。

     中断的优先级和可以被转发到的core列表都在Distributor中配置,Distributor确定可以传递到core的处于pending状态的最高优先级的中断, 然后转发到与该core相连的CPU interface。在CPU interface中,中断被依次发送给core,然后在core中会发生FIQ或者IRQ异常。

    Core会执行异常处理器(exception handler),handler必须从CPU interface 寄存器中获取到该中断的ID号,然后开始处理中断源。当处理完成后,handler必须对CPU interface的寄存器(EOI)进行写入,以说明中断处理完成。

    一个中断状态变化过程:

  • Inactive -> Pending:当中断被外设断言时
  • Pending -> Active:当中断处理器(handler)获知了当前中断
  • Active -> Inactive:handler处理完成了中断
  • 在Distributor中有相关寄存器能显示不同中断ID的当前中断状态,GIC提供寄存器来控制SPI中断转发到哪些core。这种机制使操作系统能够在core之间进行共享和分发中断。

    三,中断类型

    1,软件中断Software Generated Interrupt (SGI)

    这是由软件显式生成的,通过写入专用的Distributor寄存器,即Software Generated Interrupt Register (GICD_SGIR)。它最常用于core间通信。可以针对所有SGI,也可以针对系统中选定的一组cores。中断ID为0-15。用于给定中断的中断ID是由生成它的软件设置的。

    SGI具有边缘触发属性。中断的软件触发相当于中断请求信号的边缘转移。

    当一个SGI在多处理器实现中发生时,Interrupt Acknowledge Register,GICC_IAR的CPUID字段(或者是Aliased Interrupt Acknowledge Register,GICC_AIAR)可以确认是哪个core在请求中断。

    2,外设中断(Peripheral interrupt)

    外设中断可分为私有外设中断(Private Peripheral Interrupt,PPI)和共享外设中断(Shared Peripheral Interrupt,SPI):

    Private Peripheral Interrupt (PPI)

    特定于单个处理器的外设中断,这是一个全局外设中断,Distributor可以将其路由到一个或多个指定的cores。中断ID为16-31。这些ID标识了core私有的中断源,并且独立于另一个core上的同一中断源。

    Shared Peripheral Interrupt (SPI)

    Distributor可以将其路由到任何指定的处理器组合。这是由一个外设生成的中断,GIC可以将它路由到一个到多个core。中断号为32-1020。SPI用于从整个系统可访问的各种外设发出信号中断。

    每个外设中断也可以分为边缘触发中断和电平敏感中断:

    Edge-triggered

    这是一种在检测到中断信号的上升边缘时断言的中断,然后不管信号的状态如何,都保持断言,直到被本规范定义的条件清除为止。

    Level-sensitive

    当中断信号级别是活动的时候就断言,当中断信号级别不是活动的时候就撤销断言。

    四,中断配置Configuration

    GIC作为内存映射的外设被访问,所有的core都可以访问公共的Distributor,但是CPU interface 是banked的,这意味着,每个core可以使用相同的地址来访问它们各自私有的CPU interface,但是一个core不能访问其他core的CPU interface。

    Distributor中有一系列的寄存器用来配置每个独立中断的属性,可以配置的属性包括:

  • 中断优先级interrupt priority (GICD_IPRIORITY<n>),Distributor使用这个属性来决定接下来哪个中断将会被转发到CPU interface。
  • 中断配置 interrupt configuration (GICD_ICFGR<n>),这个决定中断是电平敏感还是边缘触发,但对SGI中断不适用,SGI只具有为边缘触发特性。
  • 中断目标处理器 interrupt target (GICD_ITARGETSR<n>),这个属性只对SPI适用,它决定了一个中断可以转发到的core列表。
  • 中断使能和禁止状态 Interrupt enable or disable status (GICD_ISENABLER<n> and
    GICD_ICENABLER<n>)
    。只有中断在Distributor中被使能enable,当中断变成pending状态的时候才会被转发。
  • 中断安全特性 Interrupt security (GICD_IGROUPR<n>),这决定了中断是否被分配到 Secure 还是 Normal (Non-Secure)区域。
  • 中断状态,Interrupt state
  • Distributor还提供了优先级屏蔽(priority masking),相当于优先级阈值,通过它,低于某个优先级的中断将被阻止到达core。Distributor在确定是否可以将pending中断转发到特定的核心时使用此方法。此外,每个core与之相连的CPU interface可以实现对中断更精细的控制。

    五,中断初始化 Initialization

    Distributor和CPU interface都会在reset的时候被disable,GIC必须在reset之后进行初始化,以便可以将中断传递到core中。

    在Distributor中,软件必须配置:优先级,目标core,安全性以及enable 状态等属性,随后必须通过其控制寄存器(GICD_CTLR)启用Distributor。

    对于每个CPU interface,软件必须编写控制中断的优先级掩码priority mask及抢占设置preemption settings(中断抢占,即中断嵌套)。每个cpu interface接口必须通过控制寄存器(GICD_CTLR)来使能,然后GIC才可以将中断转发到指定core中。

    在core预期中断到来之前,软件通过需在中断向量表中设置有效的中断向量,在PSTATE中清除中断掩码位,以及设置路由控制,让core接收中断。

    系统的完整的中断机制可以通过disable Distributor来禁止,中断传递到core中的功能也可以通过disable CPU interface来禁用,此外,每个独立的中断也可以在Distributor阶段被使能或者禁止。

    所以中断若想传递到core中,Distributor和CPU interface都必须被使能,并且需要足够的优先级(高于在优先级阈值)。

    六,中断处理 handling

    1. 当core开始处理中断时,它首先从中断向量表中获取最顶层(top-level)的中断向量,然后跳转到该向量所指向的handler并开始执行。
    2. 最顶层的中断向量指向中断处理器(handler),将会读取Interrupt Acknowledge Register,IAR寄存器来从CPU interface 中获得当前的中断ID,当中断ID返回后,这个读操作会让Distributor把当前中断的状态标记为Active。
    3. 一旦中断ID被知晓(识别了中断源),最顶层的中断handler将会派发一个针对这个中断源的handler来处理这个中断。
    4. 当针对该中断源的中断handler处理完了该中断,这个最顶层的handler将会在CPU interface 中,把该中断的ID写入End of Interrupt (EoI) 寄存器,这个操作将会让CPU interface转发其他正在pending状态的中断到core中,也包括处理单个中断的时候。
    5. 等待当前core处理的中断可能不止一个,但是CPU interface一次只能转发一个中断到core中,最顶层的中断handler将会重复上述流程,直到它读到了特殊的中断ID值1023,表明当前core以及没有正在pending的中断需要处理了,这个特殊的中断ID也称为虚假中断ID(spurious interrupt ID)。

    虚假中断ID 1023是个保留值,不能分配给任何设备,当顶层中断handler读到这个值时,它将完成它的执行,并且准备将core恢复上下文(在处理中断前的状态)。

    物联沃分享整理
    物联沃-IOTWORD物联网 » ARM GIC:通用中断控制器的简要介绍

    发表评论