Linux 中断子系统(八):中断处理流程
1、上层中断处理
系统初始化时,已经建立起 硬件中断号 和 软件中断号的 映射表
。
中断注册时,我们需要先从设备树中获取硬件中断号,然后调用 API 将硬件中断号转换为软件中断号,根据软件终端号 irq 找到对应的 irq_desc,并将中断处理函数添加到 irq_desc 中(也就是 irqaction 结构体中)。
当中断发生,根据硬件中断号通过 irq_domian 翻译成软件中断号 irq number,找到对应的 irq_desc,并最终调用到中断处理函数,处理完成恢复现场。
2、ARM 底层中断处理
1、保存中断发生时 CPSR 寄存器的内容到 SPSR_irq 寄存器中
2、修改 CPSR 寄存器,让 CPU 进入处理器模式中的 IRQ 模式,即 CPSR 寄存器中的 M 域设置为 IRQ Mode
3、硬件自动关闭中断 IRQ 或 FIQ,即 CPSR 中的 IRQ 位或 FIQ 位置 1
4、保存返回地址到 LR_irq 寄存器中
5、硬件自动跳转到中断向量表的 IRQ 向量中,后续动作都是软件行为 —–>
中断返回时,软件需要实现以下两个操作
1、从 SPSR_irq 寄存器中恢复数据到 CPSR 中
2、从 LR_irq 中回复内容到 PC 中,从而返回到中断点的下一个指令处执行。
CPSR 寄存器