这段时间遇到了一个FIQ的问题,然后想去请教一下,发现自己问不出什么问题,因为自己一无所知。终究还是自己很菜,别人一个反问
对于ARM的处理器,中断给处理器提供了触觉,使处理器能够感知到外界的变化,从而实时的处理。本系列博文,是以ARM cortex-A系列处理器,来介绍ARM的soc中,中断的处理。
1、GIC的由来
ARM cortex-A系列处理器,提供了4个管脚给soc,实现外界中断的传递。分别是:
-
nIRQ: 物理普通中断
-
nFIQ: 物理快速中断
-
nVIRQ: 虚拟普通中断
-
nVFIQ: 虚拟快速中断
如下图所示:
其中虚拟中断,是为了实现虚拟化而加入的,在这个系列中,不讨论虚拟中断,只介绍物理中断的相关知识。
在arm的soc系统中,会有多个外设,均有可能会产生中断发送给arm cpu,等待cpu处理。
而arm cpu对中断,只提供了2根信号,一个nIRQ,一个是nFIQ。 **因此就需要有一个中断控制器来作为中间的桥接,收集soc的所有中断信号,然后仲裁选择合适的中断,再发送给CPU,等待CPU处理。**如下图所示:
这中间的桥接器件,就是arm公司推出大名鼎鼎的gic,general interrupt controller。
gic其实是一个架构,版本历经了gicv1(已弃用),gicv2,gicv3,gicv4。对于不同的gic版本,arm公司设计了对应的gic IP。
-
gic400,支持gicv2架构版本。
-
gic500,支持gicv3架构版本。
-
gic600,支持gicv3架构版本。
gic的核心功能,就是对soc中外设的中断源的管理,并且提供给软件,配置以及控制这些中断源。
当对应的中断源有效时,gic根据该中断源的配置,决定是否将该中断信号,发送给CPU。如果有多个中断源有效,那么gic还会进行仲裁,选择最高优先级中断,发送给CPU。
当CPU接受到gic发送的中断,通过读取gic的寄存器,就可以知道,中断的来源来自于哪里,从而可以做相应的处理。
当CPU处理完中断之后,会告诉gic,其实就是访问gic的寄存器,该中断处理完毕。gic接受到该信息后,就将该中断源取消,避免又重新发送该中断给cpu以及允许中断抢占。
之后,会先介绍下gicv2的相关知识,然后介绍目前主流使用的gicv3。
2、中断术语
ARM在GIC中,对于中断,定义了如下的一些术语。
一、中断状态
对于每一个中断而言,有以下4个状态:
- inactive:中断处于无效状态
- pending:中断处于有效状态,但是cpu没有响应该中断
- active:cpu在响应该中断
- active and pending:cpu在响应该中断,但是该中断源又发送中断过来 以下是中断状态的转移图。至于图中的转移条件,在gic架构文档中,有介绍。
二、中断触发方式
中断触发方式,包含以下两种方式:
- edge-triggered: 边沿触发,当中断源产生一个边沿,中断有效
- level-sensitive:电平触发,当中断源为指定电平,中断有效
三、中断类型
中断类型分为以下几类:
-
PPI:(private peripheral interrupt),私有外设中断,该中断来源于外设,但是该中断只对指定的core有效。
-
SPI:(shared peripheral interrupt),共享外设中断,该中断来源于外设,但是该中断可以对所有的core有效。
-
SGI:(software-generated interrupt),软中断,软件产生的中断,用于给其他的core发送中断信号
- SGI中断也称IPI中断,即处理器间中断,一个处理器可以向其他处理器发送中断,以达到目标处理器执行某种事情。
-
virtual interrupt:虚拟中断,用于支持虚拟机
-
LPI: (Locality-specific Peripheral Interrupt):LPI 是 GICv3 中的新特性,它们在很多方面与其他类型的中断不同。LPI 始终是基于消息的中断,它们的配置保存在表中而不是寄存器。比如 PCIe 的 MSI/MSI-x 中断。
Group分组:
-
group0:安全中断,由nFIQ驱动
-
group1:非安全中断,由nFIQ驱动
四、中断优先级
因为soc中,中断有很多,为了方便对中断的管理,对每个中断,附加了中断优先级。在中断仲裁时,高优先级的中断,会优于低优先级的中断,发送给cpu处理。 当cpu在响应低优先级中断时,如果此时来了高优先级中断,那么高优先级中断会抢占低优先级中断,而被处理器响应。
五、中断号
为了方便对中断的管理,gic为每个中断,分配了一个中断号,也就是interrupt ID。
对于中断号,gic也进行了分配:
- ID0-ID15,分配给SGI(software-generated interrupt)
- ID16-ID31,分配给PPI(private peripheral interrupt)
- ID32-ID1019分配给SPI (shared peripheral interrupt)
- 其他
在具体的arm的cpu中,对于PPI,又进行了详细的分配。这个,就得看arm cpu的TRM了。
六、中断生命周期
一个中断,是有生命周期的。以下是流程图:
- start:中断开始
- generate:中断源产生中断,发送给gic
- deliver:gic将中断发送给cpu
- activate:cpu响应该中断
- deactivate: cpu响应完中断,告诉gic,中断处理完毕,gic更新该中断状态
- end:中断结束
七、banking banking
包括以下两个:
- 1、中断banking
- 对于PPI和SGI,gic可以有多个中断对应于同一个中断号。比如在soc中,有多个外设的中断,共享同一个中断号。
- 2、寄存器banking
- 对于同一个gic寄存器地址,在不同的情况下,访问的是不同的寄存器。例如在secure和non-secure状态下,访问同一个gic寄存器,其实是访问的不同的gic的寄存器。 具体,更多的信息,得看gic spec以及arm spec。
参考资料:
https://zhuanlan.zhihu.com/p/166640956
https://zhuanlan.zhihu.com/p/181342311