GIC入门(一):中断类型,状态转换,中断路由,安全模型

发布时间 2023-08-16 19:34:19作者: 崽崽姐姐的丛林
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区分不同类型的中断源:
0
 
外设发送中断给CPU的通路有两种,一种是通过signal信号线连接到GIC,一种是通过写GIC中的寄存器,这种方式叫做MSI(message-signaled interrupt)。MSI是GIC V3新增feature。
 
0
 
0
注1:使用signal信号线的方式,在大型系统有很多中断线的应用场景下造成信号线过多面积很大,使用MSI可以避免这个问题。
注2:SPI可以被设计为信号线或MSI两种方式,LPI总是MSI方式。
 

2.一个中断的状态机

GIC为SPI,SGI,PPI的每个中断源维护一个状态机,共有四种状态:
Inactive:该中断源处于未激活状态
Pending:中断源触发状态,GIC感知到,但还未被分发到PE
Active:中断已经被某个PE认领确认
Active and pending:这个中断源的一次触发已经被PE确认,同时这个中断源的另一次触发正在pending状态
 
0
中断的生命周期取决于它被配置为电平触发还是沿触发,二者的区别:
 
0
电平触发
0
沿触发
配置为电平触发时,中断源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。
 

4.安全模型

ARM引入了特权等级概念(参考Learn the architecture - AArch64 Exception Model (arm.com)),相应的,根据处理中断的状态为安全、非安全,中断也被分为了三组:
0
即需要由运行在EL3的runtime firmware处理的中断,需要由运行在S-EL1的T-OS处理的中断,以及需要由运行在NS-EL1/2的OS或虚拟化处理的中断。因此在软件上,中断向量表应该至少存在三份,来处理对应的中断。
此外,当PE运行在不同的状态时,可能会接收到上述三种中断的任意一种,比如运行在非安全状态,但来了需要EL3处理的SGroup0中断,那么就需要切换到对应的EL3状态来对这个中断进行处理。如下图所示:
0
被带到EL3的中断都是FIQ,在当前状态可以处理的中断是IRQ,如下表:
0
0
注:ARM V9中提出的realm,会被GIC视为非安全状态的一个扩展
注:GIC可以通过配置寄存器GICD_CTLR.DS位域设置安全状态有几种,设置为0时支持安全和非安全,设置为1时只支持安全状态。
 
下一章介绍GIC寄存器组成,配置和中断处理。