【发布时间】:2016-10-17 14:32:36
【问题描述】:
为什么在 linux 的中断处理程序中禁止 printk 或 (I/O) .?在什么情况下中断处理程序中的 I/O 会导致 linux 系统死锁?
【问题讨论】:
标签: linux exception linux-kernel printk
为什么在 linux 的中断处理程序中禁止 printk 或 (I/O) .?在什么情况下中断处理程序中的 I/O 会导致 linux 系统死锁?
【问题讨论】:
标签: linux exception linux-kernel printk
关于printk(),它是侵入性的。例如,您正在调试的问题可能会通过添加 printk 消失。根据设置,它可能会输出到控制台,这可能很慢。推荐使用trace_printk() 或ftrace。
至于中断中的 I/O,请记住,中断运行的优先级高于其他执行线程,因此任何延迟(无论是 I/O 还是其他)都会产生连锁反应在系统的其余部分上。
死锁可能由于资源争用而发生。例如,当一个资源(比如互斥锁)已经被运行在进程上下文中的内核线程占用时,中断到达。现在中断服务程序尝试获取相同的资源将导致死锁:内核线程无法运行,因为 ISR 具有更高的优先级,而 ISR 无法完成,因为它正在等待内核线程持有的资源。
希望它能回答您的问题。
更新:在中断处理程序中调用printk 会导致死锁吗?没有。例如this extract from makelinux
printk() 的一个特性很快被认为是理所当然的,那就是它的健壮性。 printk() 函数可以从几乎任何地方调用 内核随时。可以从中断或进程中调用 语境。它可以在持有锁时调用。它可以称为 同时在多个处理器上,但它不需要 调用者持有锁。
UPDATE2:Word of caution 感谢 tc2keats。
但是,如果 printk 在 ISR 中,则不太可能是生产代码。应该是调试。因此,如果有锁定,程序员应该会很明显:)
【讨论】:
trace_printk()