如果是到现在为止的2.6.18-RC3的内核,在中断handler中执行导致阻塞的代码,内核会把调用栈打出来,提示在atomic中调用schedule(),这个判断在schedule(). 假设没有这些判断,允许你sleep,我想到了下面的结果: 1. 如果你的handler关中断运行(flags & IRQF_DISABLED), a 可能会导致系统死掉,这取决于你的sleep是否因为其它中断 handler, b 系统延迟很大 2. 如果你的系统handler开中断运行, a 系统死掉, 如果你用4K内核栈 b 系统死掉,即使handler运行在任务栈中,因为任务的唤醒不一定取决于这次阻塞,如信号等
发布评论
评论(6)
solaris下低于时钟中断或者是dispatch lock级别以下的中断,如网卡中断,是以内核线程的形式存在的。这些线程是per CPU的,每个level一个,组成一个线程list,挂在cpu structure的结构里。
这些线程具有比一般内核线程高的优先级,可以保证尽快执行。
[ 本帖最后由 Solaris12 于 2006-8-2 13:20 编辑 ]
学习了。。。。。
对中断线程话的概念完全不了解。不知道是不是用现在内核中用工作队列处理工作下半部一样。将中断处理程序挂到一个内核线程下的工作队列里?
不知道fb是什么? 如果中断线程化指的是RT内核中实现的那样, 中断handler在线程中执行,这样的ISR可以阻塞。
如果是到现在为止的2.6.18-RC3的内核,在中断handler中执行导致阻塞的代码,内核会把调用栈打出来,提示在atomic中调用schedule(),这个判断在schedule(). 假设没有这些判断,允许你sleep,我想到了下面的结果:
1. 如果你的handler关中断运行(flags & IRQF_DISABLED),
a 可能会导致系统死掉,这取决于你的sleep是否因为其它中断 handler,
b 系统延迟很大
2. 如果你的系统handler开中断运行,
a 系统死掉, 如果你用4K内核栈
b 系统死掉,即使handler运行在任务栈中,因为任务的唤醒不一定取决于这次阻塞,如信号等
而且,根据sleep是否因为和哪些不同的上下文互斥,异常的现象需要具体分析。但你的那个设备肯定是不能正常工作的。
是这样的,在Linux的RT Patch中,如时钟中断肯定不能线程化,所以中断handler中执行导致阻塞的代码,肯定有问题。
所谓中断线程化,也是低优先级的中断。
高优先级的中断还是特殊的上下文,不能够阻塞的。
所以在solaris或者bsd这样的中断线程化的系统里,在高优先级中断睡眠,基本上就是panic或者hang了
fb下中断处理已经线程化,可以休眠。不过休眠以后这个线程就不能再唤醒了。
在solaris下,这样会引起系统panic的