Linux中断系统介绍及底层中断处理源代码分析
Linux中断系统介绍及底层中断处理源代码分析
经过以上的分析,可以将Linux内核底层中断处理流程总结如下:
vector_irq 中断向量表入口 ->__irq_usr 中断发生在usr模式 ->usr_entry 保存中断上下文 ->irq_handler 处理中断 ->handle_arch_irq 可设置的中断处理函数,需要定义CONFIG_MULTI_IRQ_HANDLER选项 ->arch_irq_handler_default 默认的中断处理函数 ->ret_to_user_from_irq 退出中断 ->slow_work_pending 退出中断前会检查是否需要重新调度、是否有信号挂起等,如有则会执行 ->__irq_svc 中断发生在svc模式 ->svc_entry 保存中断上下文 ->irq_handler 处理中断 ->handle_arch_irq 可设置的中断处理函数,需要定义CONFIG_MULTI_IRQ_HANDLER选项 ->arch_irq_handler_default 默认的中断处理函数 ->svc_preempt 如果定义CONFIG_PREEMPT选项,则退出中断前会检查内核是否可以抢占, 如可以则会执行抢占 ->svc_exit 退出中断
从相关的书籍中,可以看到ARM处理器进入中断时会自动关闭CPU的中断,退出中断时自动打开中断的结论。但在分析中断进入和退出的时候并没有看到关闭中断和打开中断的代码。ARM CPU的中断关闭和打开通过设置CPSR寄存器的bit[7]和bit[6],bit[7]设置IRQ,bit[6]设置FIQ,bit[6]和bit[7]为1时,关闭对应的中断,为0时打开对应的中断。为了验证上述结果,因此在中断处理的通用函数gic_handle_irq中,读取CPU的CPSR和SPSR寄存器,CPSR可以判断当前CPU的中断状态,SPSR可以判断中断退出后CPU的中断状态。测试代码如下图所示。

测试结果如下图所示。在中断处理的通用函数gic_handle_irq中,CPSR的bit[7]始终为1,说明中断是关闭的,在这之前并没有关闭中断的代码,因此可以认为发生中断时CPU自动关闭了中断;SPSR的bit[7]始终为0,说明中断发生前中断是打开的,当中断退出时,将SPSR寄存器的数据恢复到CPSR中,实现了中断返回、CPU模式切换和打开CPU的中断,因此在中断退出时不需要额外的代码去打开中断。

浙公网安备 33010602011771号