printk在一个中断处理程序中,它真的那么糟糕吗?

时间:2012-01-05 07:20:41

标签: c linux-kernel interrupt-handling printk

每个人都知道中断处理程序应该尽可能短。并且在中断处理程序中添加用于调试的printk等函数是不应该做的。 实际上,我之前在为我编写的中断驱动的char设备调试linux内核时尝试过它,它破坏了驱动程序的时间。

我的问题是,为什么会发生这种情况? printk函数被缓冲了!这意味着,据我所知,数据被插入到队列中,并且稍后处理,很可能是在中断处理程序完成之后。

那为什么不起作用?

2 个答案:

答案 0 :(得分:29)

printk函数不只是插入队列/缓冲区 - 假设日志级别足够高,printk的输出将立即发送到控制台,作为调用的一部分到printk。如果控制台是在串行端口上,则这尤其慢。但无论如何,printk确实会引入相当大的开销,并且会影响时序。

如果您有一个需要获得调试输出的时序关键位置,您可以查看在现代内核中使用trace_printk函数。这实际上只是将输入放入跟踪环形缓冲区,您可以稍后阅读。有关详细信息,请查看this article

答案 1 :(得分:-4)

是的,这是非常糟糕的,因为printf很可能不是可重入的。可能发生的是主程序调用printf,中断在printf执行时到达,然后IRQ处理程序再次调用printf:可能发生非常糟糕的事情(例如,死锁,损坏的内部缓冲区,等)