GIC是ARM的通用中断处理器,和ARM Cortex-A和Cortex-R系列CPU搭配使用,M系列使用NVIC(nested vectored interrupt controller)。 本篇文章介绍GIC V3、V4的一些基本概念:中断类型,状态转换,中断路由,安全模型
1.Interrupt types
SPI: shared phripheral interrupt,可以设置为被所有PE处理的外设中断 SGI: software generated interrupt PPI: private peripheral interrupt,绑定到固定PE进行处理的外设中断 LPI: locality-specific peripheral interrupt(GIC V3之后增加的feature) GIC根据INTID区分不同类型的中断源: 外设发送中断给CPU的通路有两种,一种是通过signal信号线连接到GIC,一种是通过写GIC中的寄存器,这种方式叫做MSI(message-signaled interrupt)。MSI是GIC V3新增feature。 注1:使用signal信号线的方式,在大型系统有很多中断线的应用场景下造成信号线过多面积很大,使用MSI可以避免这个问题。 注2:SPI可以被设计为信号线或MSI两种方式,LPI总是MSI方式。2.一个中断的状态机
GIC为SPI,SGI,PPI的每个中断源维护一个状态机,共有四种状态: Inactive:该中断源处于未激活状态 Pending:中断源触发状态,GIC感知到,但还未被分发到PE Active:中断已经被某个PE认领确认 Active and pending:这个中断源的一次触发已经被PE确认,同时这个中断源的另一次触发正在pending状态 中断的生命周期取决于它被配置为电平触发还是沿触发,二者的区别: 电平触发 沿触发 配置为电平触发时,中断源trigger电平为高,GIC-Core信号随之为高,此时中断状态变为pending。当信号被分发到PE并被PE确认之后,GIC-Core信号变为低,但中断源信号仍为高,因此此时中断状态为active and pending。直到中断源信号变为低,中断状态转为active。中断处理结束之后状态转为inactive。完成一次中断处理的状态周期。 配置为沿触发时,中断源trigger边沿信号之后变为低,检测到沿信号之后GIC-Core置高,此时中断未被分发到PE,状态是pending。PE确认中断之后GIC-Core信号随之置低,中断状态变为active,PE对当前中断源进行对应的处理。若此时再次触发中断,中断状态变为active and pending。当前中断处理完之后,GIC-Core置高,等到PE响应,中断状态变回pending。 结论:沿触发的状态周期相对电平触发短。3.中断如何路由到指定PE
ARM架构中为每一个PE都设置特定的标识符,这个标识符存在MPIDR_EL1寄存器中,位域定义如下:ARM不同的处理器有不同的定义和实现,常见的两种实现如下: ARM Cortex-A53/A57中:
ARM Cortex-A55/A76中:
寄存器的理解参考:ARMv8/ARMv9:深入理解MPIDR_EL1寄存器中的affinity - 极术社区 - 连接开发者与智能计算生态 (aijishu.com) GIC正是根据affinity的值来确定要路由到哪个PE。