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的中断,因此在中断退出时不需要额外的代码去打开中断。

 

 

posted on 2022-07-04 15:01  tycoon3  阅读(498)  评论(0)    收藏  举报

导航