printk简介
在Linux内核中没有printf函数,那么内核是怎么打印调试信息的呢,这里我们用到的是printk函数,在内核中想要向控制台输出或者显示一些内容,必须需要printk函数,这个函数。不同之处在于, printk可以根据日志级别对消息进行分类,一共有 8个消息级别,这 8个消息级别定义在文件 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" 调试信息
#define KERN_DEFAULT KERN_SOH "d" /* the default kernel loglevel */
这里一共定义了8个级别,其中0的优先级最高,7的优先级最低,如果要设备消息级别,参考如下案例:
printk(KERN_EMERG "sos message\n");
如果使用printk的时候不显示设置消息级别,那么printk将会采用默认级别为MESSAGE_LOGLEVEL_DEFAULT MESSAGE_LOGLEVEL_DEFAULT默认为 4。
在 include/linux/printk.h中有个宏 CONSOLE_LOGLEVEL_DEFAULT,定义如下:
#define CONSOLE_LOGLEVEL_DEFAULT 7
CONSOLE_LOGLEVEL_DEFAULT控制着哪些级别的消息可以显示在控制台上,此宏默认为 7,意味着只有优先级高于 7的消息才能显示在控制台上。这个就是 printk和 printf的最大区别,可以通过消息级别来决定哪些消息可以显示在控制台上。默认消息级别为 4,4的 级别比 7高,所示直接使用 printk输出的信息是可以显示在控制台上的。
调整内核printk的打印级别
在调试Linux内核模块时,有时候我们不想要这么多的内核打印信息,那我们可以操作/proc/sys/kernel/printk文件来调整printk的打印级别。其中内核printk的默认打印级别为
# cat /proc/sys/kernel/printk
7 4 1 7
该文件有四个数据,其中每一个数据代表内容为:
控制台日志级别 : 优先级高于该值的消息将会被打印到控制台
默认的消息日志级别 :将用该优先级来打印没有优先级的消息
最低的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级)
默认的控制台日志级别:控制台日志级别的缺省值
那么我们可以手动去调整printk的打印级别,比如我需要屏蔽所有的打印级别,我们可以
#echo 1 4 1 7 > /proc/sys/kernel/printk
参考:https://blog.csdn.net/tonywgx/article/details/17504001