关于中断处理程序中断服务例程ISR的区别及联系,之前一直搞混,今天抽时间将两者关系弄弄清楚。ok,下面进入主题。
       首先中断处理程序(Interrupt Handler)和中断服务例程ISR(Inerrupt Service Routine)是两个不同的概念.
简单来说就是,一条中断线对应一个中断处理程序,而一个中断处理程序再对应若干个中断服务例程,具体看下图所示:

       从上图中能很直观的看出所有的中断服务例程挂在中断请求队列中,这个工作是由request_irq()函数来完成的,其实也就是对中断服务例程进行注册,关于这个函数的具体实现在include/linux/interrupt.h中。而中断处理程序就相当于某个中断向量的总的处理程序,比如上图中IRQ0x09_interrupt()是中断号为9(向量为47)的总处理程序,假如这个9号中断由5个设备共享,那么这5个设备都分别有其对应的中断服务例程。
        也就是说当有多个设备需要共享某个中断线时,中断处理程序必须要调用ISR,此时会调用handle_IRQ_event()
来运行挂在该中断线上的所有中断服务例程,下图给出了具体的调用关系:

这其实就是中断处理程序的执行过程。其中IRQn_interrupt表示从IRQ0x00_interrupt到IRQ0x0f_interrupt的任意一个中断处理程序。这个中断处理程序需要调用do_IRQ()函数,而do_IRQ()函数对收到的中断请求进行应答,并禁止这条中断线,然后要确保这条中断线上有一个有效的中断服务例程,而且目前这个这个中断服务例程已经启动但未执行。这时do_IRQ()调用handle_IRQ_event()来运行挂在这条中断线上的所有中断服务例程。
       最后再补充说明一下在内核中用于让多个设备共享一条中断线而设置的数据结构irqaction(3.7版本的内核):
typedef irqreturn_t (*irq_handler_t)(int, void *);    //声明一个中断服务例程的钩子函数,返回值为irqreturn_tx型
struct irqaction { 
              irq_handler_t handler;                             //指向一个具体的I/O设备的中断服务程序 
              void *dev_id;                                 //指定的I/O设备的主设备号和次设备号 
              void __percpu *percpu_dev_id;              //用于识别不同cpu设备的资料
              struct irqaction *next;                               //指向用于共享中断线的下一个irqaction结构 
              irq_handler_t thread_fn;                         //指向一个具体的线程化中断的中断服务例程 
              struct task_struct *thread;                           //指向线程中断的线程指针
              unsigned int irq;                                     //所申请的中断号
              unsigned int flags;                                  //一组用于描述中断线与I/O设备之间关系的中断标志 
              unsigned long thread_flags;                    //用于描述线程中断的中断标志 
              unsigned long thread_mask;                   //中断掩码
              const char *name;                               //中断设备名称 
              struct proc_dir_entry *dir;                              //指向IRQn相关的/proc/irq/n目录的描述符
____cacheline_internodealigned_in_smp;    
         
转自:http://blog.chinaunix.net/uid-27177626-id-3438994.html
 

最新文章

  1. CentOS桌面安装
  2. 如何使cookie全站都生效?
  3. Linux shell 脚本攻略之比较与测试
  4. java学习——集合框架(泛型,Map)
  5. 简单利用HTTP中的PUT协议拿下SHELL
  6. 处理win7任务栏通知区域图标异常问题
  7. 用animation的steps属性制作帧动画
  8. DDoS攻击与防御(3)
  9. 机智的MySQL优化器 --- is null
  10. 模板引擎之-jade
  11. SQL alwayson 辅助接点查询统计信息“丢失”导致查询失败
  12. 【ArcGIS】安装ArcEngine 10的顺序
  13. AI 循环神经网络
  14. 设置滚动条scrolltop
  15. MySQL,Oracle,PostgreSQL,mongoDB,Hive, SAP HANA 数据库web维护客户端管理工具
  16. 13.2SolrCloud集群使用手册之CoreAdmin API
  17. WIN 10系统下,在DOS窗口输入Java或者javac出现乱码的解决方法
  18. soj2013.Pay Back
  19. 个人开源项目之异步Http线程池框架
  20. union共用体的对齐

热门文章

  1. StarGAN学习笔记
  2. JAVA 架构和技术框架百科
  3. 字符串转换成float和double类型
  4. APP开发基础知识(转载)
  5. Hadoop运行环境搭建
  6. Ansible入门笔记(2)之常用模块
  7. prometheus学习系列十: Prometheus AlertManager配置文件说明
  8. c#: 剪切板监视实现
  9. CentOS6.7安装部署之Tomcat多实例
  10. python 连接 redis cluster 集群