中断处理程序中的Printk或I / O危险

时间:2016-10-17 14:32:36

标签: linux exception linux-kernel printk

为什么在linux中的中断处理程序中禁止printk或(I / O)。在什么条件下,中断处理程序中的I / O会导致linux系统死锁?

1 个答案:

答案 0 :(得分:1)

关于printk() ,它是侵入性的。例如,您调试的问题可能会因添加printk而消失。根据设置,它可能会输出到控制台,这可能很慢。建议使用ftrace trace_printk()

至于中断中的 I / O,请记住中断的执行优先级高于其他执行线程,因此任何延迟 - 无论是I / O还是别的 - 都会产生影响在系统的其余部分。

由于资源争用,可能会发生

死锁。例如,当一个资源(例如互斥锁)已经被在进程上下文中运行的内核线程占用时,中断到达。现在中断服务程序想要获取相同资源的尝试会导致死锁:内核线程无法运行,因为ISR具有更高的优先级而ISR无法完成,因为它正在等待所持有的资源通过内核线程。

希望它能回答你的问题。

UPDATE:在中断处理程序中调用printk会导致死锁吗?不。例如this extract from makelinux

  

printk()的一个属性很快被认为是理想的,它的稳健性。   printk()函数可以从几乎任何地方调用   内核随时都有。它可以从中断或进程调用   上下文。可以在锁定时调用它。它可以被称为   同时在多个处理器上,但它不需要   打电话来保持锁定。

UPDATE2:Word of caution感谢tc2keats。

但是,如果printk在ISR中,则不太可能是生产代码。可能是调试。因此,如果存在锁定,程序员应该会明白:)