- 论坛徽章:
- 0
|
本帖最后由 frank529 于 2012-11-01 09:26 编辑
这个问题有很多人问,但感觉一直没有一个合理的解释。参见帖子《关于LINUX在中断(硬软)中不能睡眠的真正原因》:
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=2115820
先来看这个问题的起源(ULK中文第三版147页):
允许内核控制路径嵌套执行必须付出代价,那就是中断处理程序必须永不阻塞,换句话说,中断处理程序运行期间不能发生进程切换。事实上,嵌套的内核控制路径恢复执行时需要的所有数据都存放在内核态堆栈中,这个栈毫无疑义的属于当前进程。
英文版:
The price to pay for allowing nested kernel control paths is that an interrupt handler must never block, that is, no process switch can take place until an interrupt handler is running. In fact, all the data needed to resume a nested kernel control path is stored in the Kernel Mode stack, which is tightly bound to the current process.
根据这段描述,我们可以得到以下几点信息:
1、中断是可以嵌套的,即文中所说的“内核控制路径嵌套”,意思就是一个中断服务程序可以被高优先级的中断打断。
2、中断处理程序不能阻塞的原因是由于中断嵌套。
3、中断上下文是保存在当前进程的内核栈中。
参考帖子《关于LINUX在中断(硬软)中不能睡眠的真正原因》的回复,大家认为中断服务程序不能嵌套的原因大致有以下几点:
1、中断上下文不像进程上下文,没法保存,也就是中断服务程序睡眠了就再也切不回来了
2、中断是一种紧急事务,必须立即处理,比如时钟中断,一睡眠的话系统时间都乱了
我认为以上观点都没道理,理由如下:
1、参考ULK给出的信息2,中断不能睡眠是由于中断可以嵌套,以上理由跟中断嵌套没有关系
2、参考ULK给出的信息3,中断上下文是保存着当前进程的内核栈中,而且每个进程都有各自的内核栈,互不影响。既然保存了上下文,中断服务程序切走了当然还能切回来,而且切到其他进程也不影响其他进程响应新的中断。
3、第二个理由只是说明紧急中断不应该睡眠,而不是中断不能睡眠的理由。我在中断服务程序里先把紧急的事干了,后面的事不紧急了,凭啥不让我睡眠?就算切换到其他进程,它还是能再次响应中断。
因此,我觉得问题应该这么问:为什么中断嵌套的代价是中断服务程序不能阻塞?
希望高手能给个一针见血的回答。
|
|