前面已经学习了中断的注册过程,下面由一张流程图来看一下当中断发生时的处理流程:
中断发生之后处理流程
a -- 具体的CPU architecture相关模块进行现场保护,然后调用machine driver执行对应的中断处理handler;
b -- machine driver对应中断处理handler会根据硬件的信息获取HW interrupt id,然后通过irq domain模块翻译成irq number;
c -- 调用该IRQ number对应 hign level irq event handler,在这个hign level的handler中,会通过和中断控制器交互,进行中断处理的flow 控制(中断的嵌套、抢占),最终会遍历我们注册的IRQ action list,调用对应处理函数;
d -- CPU architeccture相关模块进行现场的恢复;
具体分析之前先看几个基础概念:
一、 中断硬件框架
中断的主动通知特性需要硬件设施支持。在数字逻辑电路层面,外部设备和处理器之间有一条专门的中断信号线(Interrupt Line),用于连接外设与CPU的中断引脚(Interrupt Pin)。当外部设备发生状态改变时,可以通过这条信号线向处理器发出一个中断请求(Interrupt Request,IRQ),其中外部设备通常被称作中断源(Interrupt Source)。
处理器一般只有两根左右的中断引脚(Cortex A9 中的 IRQ、FIQ),而管理的外设却很多。为了解决这个问题,现代设备的中断信号线并不是与处理器直接相连,而是与一个称为中断控制器的设备相连接,后者才跟处理器的中断引脚连接。中断控制器一般可以通过处理器进行编程配置,在Cortex A9 中称为通用中断控制器GIC(Gerneric Interrupt Controller)。下图是一个典型的中断硬件连接的系统框架图:
这里的中断控制器是可编程中断控制器PIC(Programmable Interrupt Controller)。上图中,PIC的输出中断信号线连接到处理器的INT引脚上,这是处理器专门用来接收中断信号的pin脚。外部设备的中断线连接到PIC的pin引脚上,这是PIC用来接收外设中断的pin脚。比如第一个设备的中断线通过P0连