书籍“linux device drivers”第四章,主讲一些debugging skills。其中就有提到printk。
printk函数包括,打印优先级,格式化字符串,具体变参。
例如:
printk(KERN_DEBUG "Here I am: %s:%i ", _ _FILE_ _, _ _LINE_ _); printk(KERN_CRIT "I'm trashed; giving up on %p ", ptr);
printk打印的消息,存储在环形buffer中,以及/proc/kmsg 文件中。
klogd通过读取/proc/kmsg 文件来接收打印消息。
klogd可以接收打印消息,并将其发送给syslogd服务。syslogd会对打印消息按照优先级进行归类,并且分发给不同的设施。这些设施需要关注对应优先级的打印消息。
在linux系统中klogd和syslogd服务同时被启动的时候,printk打印的消息会出现在var/log/messages 文件中。
如果klogd服务未启动,则消息会在/proc/kmsg 文件中,通过dmesg命令打印的消息就来自于这个文件。
可以通过文件/proc/sys/kernel/printk设置允许哪些级别的消息,能够打印在终端上。
注意printk打印的消息,除了显示在终端上,还是被重定向到其他文件中。
当驱动开发者不注意,例如在驱动硬件的时候fail了,而驱动会printk fail error信息,并且不停的重试,那么会不停的有打印消息出来。恰好接收端是个慢速设备,来不及接收这么多打印消息的话,CPU就会被占用殆尽。
因为当遇到需要不停的打印消息的时候,需要借助
printk_ratelimit
使用方法为:
if (printk_ratelimit( )) printk(KERN_NOTICE "The printer is still on fire ");