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

std*_*all 13 c linux-kernel interrupt-handling printk

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

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

那为什么不起作用呢?

Rol*_*and 29

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

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