(转) 中断处理程序&中断服务例程
首先中断处理程序(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;
(转) 中断处理程序&中断服务例程的更多相关文章
- Linux设备驱动 之 中断处理程序
注册中断处理程序 中断处理程序是管理硬件驱动程序的组成部分:如果设备使用中断,那么相应的驱动程序就注册一个中断处理程序: 驱动程序通过request_irq()函数注册,并且激活给定的中断线,以处理中 ...
- 中断——中断处理程序的进入与退出 (基于3.16-rc4)
上一篇博文我们分析了中断描述符表的中断门初始化过程,并且在interrupt数组中初始化过程中,可以看到每个中断处理程序都会跳入common_interrupt中.下面我们分析下common_inte ...
- 驱动:中断【2】中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)
中断处理程序.中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)http://blog.csdn.net/samantha_sun/article/details/6790492 1,中 ...
- 13.linux中断处理程序
linux中断处理程序 一.中断处理流程 在linux内核代码中进入entry-armv.S目录: linux统一的入口:__irq svc. 进入了统一的入口之后,程序跳到irq_handler标号 ...
- linux内核--中断处理程序
一个设备的中断处理程序是它设备驱动程序的一部分--设备驱动程序是用于对设备进行管理的内核代码.中断处理程序与其他内核函数的真正区别在于,中断处理程序是被内核调用来响应中断的,而它们运行于我们称之为中断 ...
- 中断处理程序不能使用printf的本质
vxworks 中断处理程序之所以不用printf,本质在于printf是将信息输出到标准输出设备(STDOUT)中, 整个标准输出设备是一个全局变量,由于有semTake操作,那么就会发生阻塞,vx ...
- linux内核分析笔记----中断和中断处理程序【转】
转自:http://www.cnblogs.com/hanyan225/archive/2011/07/17/2108609.html 中断还是中断,我讲了很多次的中断了,今天还是要讲中断,为啥呢?因 ...
- 【译】x86程序员手册33-9.6中断任务和中断处理程序
9.6 Interrupt Tasks and Interrupt Procedures 中断任务和中断处理程序 Just as a CALL instruction can call either ...
- linux内核分析笔记----中断和中断处理程序
中断还是中断,我讲了很多次的中断了,今天还是要讲中断,为啥呢?因为在操作系统中,中断是必须要讲的.. 那么什么叫中断呢, 中断还是打断,这样一说你就不明白了.唉,中断还真是有点像打断.我们知道linu ...
随机推荐
- Linux中Crontab的使用
一.安装依赖 yum install cronie 二.添加 Crontab crontab -e 三.查看crontab内容 crontab -l 其中常见的一些内容 例子: # 每月的最后1天 0 ...
- 2年java,蚂蚁一面,卒
其实我一个都没答上来.并不是因为我笨,是因为我不会.在大扰的帮助下,现在我会了,求求你再给我一个机会. TreeSet/HashSet 区别 顾名思义,首先是结构上的不同 1.TreeSet背后的结构 ...
- ReactiveObjC basic
基础-> https://www.jianshu.com/p/cd4031fbf8ff 在RAC中,万物皆信号. RAC 指的就是 RactiveCocoa ,是 Github 的一个开源框架, ...
- httpget请求测试用Java代码的实现方法
原文:http://www.cnblogs.com/johnson-yuan/p/6637906.html 1.首先要在eclipse中导入HttpClient的jar包. 2.新建类并写入一下代码: ...
- BLAS快速入门
一.简介 BLAS[Basic Linear Algebra Subprograms,基础线性代数程序集]是一个应用程序接口[API]标准,用于规范发布基础基础线性代数操作的数值库[常用于向量或矩阵计 ...
- 在 Vim 中,删除 ^@ 符号的几种方法
在 Vim 中,^@ 表示 ASCII 码中的 NULL 字符,编码为 0x00,占用一个字节. 删除方法 方法1,采用 <CTRL-V><CTRL-J> 或 <CTRL ...
- idea git提交代码步骤(转载)
参考一: https://blog.csdn.net/u013452337/article/details/79956604
- SQL 乐色干货笔记
因为公司基本都是用存储过程所以本来写的干货基本都是存储过程的. SELECT TOP 1 Code,Invitation,Num,Typ FROM SignLog WITH(NOLOCK) WHERE ...
- Odoo搜素视图过滤器之筛选与分组
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826168.html 一:过滤器 搜索视图还可以包含<filter>元素,定制过滤器. 过滤器 ...
- sparkstreaming写入hbase表中总结
执行spark代码插入数据到hbase表中去的时候,遇到的错误 1. 缺少hadoop-mapreduce-client-core-2.5.1.jar包 错误:java.lang.ClassNotFo ...