LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2726|回复: 14

请问linux2.6中硬件中断处理程序能否被新的硬件中断处理程序打断?我指的是顶半部,不是

[复制链接]
发表于 2007-6-27 08:57:10 | 显示全部楼层 |阅读模式
如题,请问linux2.6中硬件中断处理程序能否被新的硬件中断处理程序打断?我指的是顶半部,不是软中断处理。
发表于 2007-6-27 09:38:12 | 显示全部楼层
当然可以.
在ULK3的第4.3节中有讲到.

Kernel control paths may be arbitrarily nested; an interrupt handler may be interrupted by another interrupt handler, thus giving rise to a nested execution of kernel control paths
回复 支持 反对

使用道具 举报

发表于 2007-6-28 09:02:58 | 显示全部楼层
上半部的也可以?想看到更多的证据.
因为楼上的文档没有提到上半部分.
回复 支持 反对

使用道具 举报

发表于 2007-6-28 10:11:48 | 显示全部楼层
Post by realtang
上半部的也可以?想看到更多的证据.
因为楼上的文档没有提到上半部分.

我是这样来看的, 如果有不正确的地方, 请指正.
1.request_irq()这个函数的flag位可以被设置为SA_INTERRUPT,而该位被设置时,表明这是一个"快速"的中断处理例程,快速处理例程运行在中断的禁用状态下. 而中断禁用的话, 此时当然不能被其它中断打断, 但是如果不设置这个位呢?
2.在LDD3上说, 在现代系统中, SA_INTERRUPT只是在少数几种特殊的情况下使用.读者不应该使用SA_INTERRUPT标志. 除非有足够必要的理由想要在其它中断被禁用的时候运行自己的中断处理例程.
3.上半部与下半部最大的不同就是当底半部处理例程在执行时,所有的中断都是打开的.
4.通常, 如果设备有一个已注册的处理例程并且发生了中断, 则函数handle_IRQ_event会被调用以便实际调用处理例程, 如果处理例程是慢速类型(即SA_INTERRUPT未被设置), 将重新启用硬件中断, 并调用处理例程. 然后只是做一些清理工作. 接着运行软件中断.
综合这些, 而且在ULK中专门有一节是讲嵌套中断, 所以我认为中断处理程序是可以被其它中断打断的. 当然,此时它不能禁止中断.
回复 支持 反对

使用道具 举报

发表于 2007-6-28 13:48:06 | 显示全部楼层
我不记得哪个文档了,说是一般情况下ISR是关中断的,所以不能说中断代码是抢占的。但是ISR可以选择适当的时间使自己sleep,这时其他的中断就可以执行了。
这就是一种叫做协作式多任务的内核结构。
回复 支持 反对

使用道具 举报

发表于 2007-6-28 14:08:07 | 显示全部楼层
它选择的这个时间让自己sleep仿佛只有在工作队列的下半部中才可以睡眠吧, 其它的软中断, tasklet不能睡眠. 至于硬中断. 在Linux的设计中是不允许睡眠的. 恰好这几天有另外一个贴子在讨论睡眠的情况. 也和这个相关, 可以看一看.
http://linux.chinaunix.net/bbs/thread-902033-1-1.html
回复 支持 反对

使用道具 举报

发表于 2007-6-28 17:41:46 | 显示全部楼层
又看了下有关文章,在标准的2.6内核中,目前ISR还不能被抢占。
但是Timesys给2.6内核打的实时patch里面,已经把ISR实现成kernel thread.
就像现在用ksoftirqd去实现下半部一样。
所以Timesys的2.6内核已经可以实现ISR的抢占执行,优先级高的可以抢占优先级低的。
大家可以看看以下网页
http://book.opensourceproject.or ... 0/ch17lev1sec3.html
回复 支持 反对

使用道具 举报

发表于 2007-7-7 17:20:06 | 显示全部楼层
在标准的2.6内核里面,顶半部的硬件中断处理程序是关中断运行的,所以不能抢占,而底半部是可以抢占的,这也是为什么要把中断处理程序分为顶半部与底半部的原因。顶半部只处理不耗时的操作(比如对中断位置位等),底半部处理耗时的操作(比如数据拷贝等)。可以参考《linux内核设计与实现》,讲述非常简明扼要!
回复 支持 反对

使用道具 举报

发表于 2007-7-7 20:35:35 | 显示全部楼层
有的说可以中断,有的说不能,到底能不能呢?
回答是,要看具体的中断处理程序,中断处理程序在申请的时候,调用函数
int request_irq(unsigned int irq,irqreturn_t (*handler) (int,void *,struct pt_reg *),unsigned long irqflags,等等)
最重要的是irqflags参数,可以为0,也可以为SA_INTERUPT,如果定义为SA_INTERUPT,表示该中断处理程序是一个快中断处理程序,在该中断处理程序执行过程中是不允许中断的
但是如果定义为0,在通用的中断处理函数中,会对其进行检查,
if(!(action->flags&SA_INTERUPT))
__sti();
看,中断是打开的,也就是说,允许中断的nested,否则,中断是关闭着的
这表明,关中断是个既不可不用,又不可乱用的手段
回复 支持 反对

使用道具 举报

发表于 2007-7-7 21:52:17 | 显示全部楼层
我是这么理解ISR和softirq,如果某个驱动程序设置的慢中断,那么该慢中断可能会被其它类型的不是同一个中断通道号的别的ISR抢占,但是这个抢占的ISR在运行快结束,调用了do_softirp的时候,这个函数判断到当前CPU仍然处于中断状态,就立刻返回。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表