为什么在 linux 的中断处理程序中禁止 printk 或 (I/O) .? 在什么情况下中断处理程序中的 I/O 会导致 Linux 系统死锁?
问问题
1037 次
1 回答
1
关于printk()
,它是侵入性的。例如,您正在调试的问题可能会通过添加 printk 消失。根据设置,它可能会输出到控制台,这可能很慢。trace_printk()
建议使用ftrace。
至于中断中的 I/O,请记住,中断运行的优先级高于其他执行线程,因此任何延迟(无论是 I/O 还是其他)都会对系统的其余部分产生连锁反应。
由于资源争用,可能会发生死锁。例如,当一个资源(比如互斥体)已经被运行在进程上下文中的内核线程占用时,中断到达。现在中断服务程序尝试获取相同的资源将导致死锁:内核线程无法运行,因为 ISR 具有更高的优先级,而 ISR 无法完成,因为它正在等待内核线程持有的资源。
希望它能回答您的查询。
更新:调用printk
中断处理程序会导致死锁吗?不,例如这个来自 makelinux 的摘录
printk() 的一个属性很快被认为是理所当然的,那就是它的健壮性。printk() 函数可以随时从内核中的任何位置调用。它可以从中断或进程上下文中调用。它可以在持有锁时调用。它可以在多个处理器上同时调用,但它不需要调用者持有锁。
UPDATE2:感谢 tc2keats 。
但是,如果 printk 在 ISR 中,则不太可能是生产代码。应该是调试。因此,如果有锁定,程序员应该很明显:)
于 2016-10-18T14:55:28.853 回答