需求

为什么在驱动调试的时候,有些 printk 没有显示?

解决

printk 打印的信息分等级,只有超过控制台级别,才能被打印出来。

include/linux/kern_levels.h

#define KERN_SOH "\001"
#define KERN_EMERG KERN_SOH "0" /* 紧急事件,一般是内核崩溃 */
#define KERN_ALERT KERN_SOH "1" /* 必须立即采取行动 */
#define KERN_CRIT KERN_SOH "2" /* 临界条件,比如严重的软件或硬件错误*/
#define KERN_ERR KERN_SOH "3" /* 错误状态,一般设备驱动程序中使用KERN_ERR 报告硬件错误 */
#define KERN_WARNING KERN_SOH "4" /* 警告信息,不会对系统造成严重影响 */
#define KERN_NOTICE KERN_SOH "5" /* 有必要进行提示的一些信息 */
#define KERN_INFO KERN_SOH "6" /* 提示性的信息 */
#define KERN_DEBUG KERN_SOH "7" /* 调试信息 */

默认的日志级别在 kernel/printk.c 中。可以使用 cat 来获取当前设置的级别.

[root@RedHat /]# cat /proc/sys/kernel/printk
4       4       1       7
  1. 控制台日志级别:优先级高于该值的消息将被打印至控制台。
  2. 缺省的消息日志级别:将用该值来打印没有优先级的消息。
  3. 最低的控制台日志级别:控制台日志级别可能被设置的最小值。
  4. 缺省的控制台:控制台日志级别的缺省值。

如果想要控制台显示所有日志信息,只需要把第一个值改为8即可。

[root@RedHat /]# echo 8 >/proc/sys/kernel/printk

参考