1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > linux内核中printk的打印级别

linux内核中printk的打印级别

时间:2019-11-28 18:41:28

相关推荐

linux内核中printk的打印级别

内核中预定义的内核log等级

// include/linux/kern_levels.h#define KERN_SOH "\001"/* ASCII Start Of Header */#define KERN_SOH_ASCII '\001'#define KERN_EMERG KERN_SOH "0" /* system is unusable */#define KERN_ALERT KERN_SOH "1" /* action must be taken immediately */#define KERN_CRIT KERN_SOH "2" /* critical conditions */#define KERN_ERR KERN_SOH "3" /* error conditions */#define KERN_WARNING KERN_SOH "4" /* warning conditions */#define KERN_NOTICE KERN_SOH "5" /* normal but significant condition */#define KERN_INFO KERN_SOH "6" /* informational */#define KERN_DEBUG KERN_SOH "7" /* debug-level messages */#define KERN_DEFAULT KERN_SOH "d" /* the default kernel loglevel */

为什么是\001呢,那什么又是SOH字符呢?

0~127的每个数字,都可以看做一个字符。’\001’是8进制的1,转换成十进制,也是1。

控制字符(Control Character),出现于特定的信息文本中,表示某一控制功能的字符。

在ASCII码中,第0~31号及第127号(共33个)是控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等。

printk打印消息控制

// linux/include/printk.h/* printk's without a loglevel use this.. */#define MESSAGE_LOGLEVEL_DEFAULT CONFIG_MESSAGE_LOGLEVEL_DEFAULT/* We show everything that is MORE important than this.. */#define CONSOLE_LOGLEVEL_DEFAULT 7 #define CONSOLE_LOGLEVEL_MIN1 #define CONSOLE_LOGLEVEL_DEFAULT 7 -------------------------------------------------------------------------// kernel/printk.cint console_printk[4] = {CONSOLE_LOGLEVEL_DEFAULT, /* console_loglevel */MESSAGE_LOGLEVEL_DEFAULT, /* default_message_loglevel */CONSOLE_LOGLEVEL_MIN, /* minimum_console_loglevel */CONSOLE_LOGLEVEL_DEFAULT, /* default_console_loglevel */};-------------------------------------------------------------------------// linux/include/printk.hextern int console_printk[];#define console_loglevel (console_printk[0])#define default_message_loglevel (console_printk[1])#define minimum_console_loglevel (console_printk[2])#define default_console_loglevel (console_printk[3])

console_loglevel

只有当printk打印消息的log优先级高于console_loglevel时,才能输出到终端上

default_message_loglevel

printk打印消息时默认的log等级

minimum_console_loglevel

console_loglevel可以被设置的最小值

default_console_loglevel

console_loglevel的缺省值

1. 查看当前printk打印消息的log等级

# cat /proc/sys/kernel/printk# 7 4 1 7

“7 4 1 7” 分别对应console_loglevel、default_message_loglevel、minimum_c onsole_loglevel、default_console_loglevel,意味着只有优先级高于KERN_DEBUG(7)的打印消息才能输出到终端

2. 改变console_loglevel

# echo 8 4 1 7 > /proc/sys/kernel/printk

输入“8 4 1 7”改变console_loglevel值,使得所有的打印消息都能输出到终端;

如果想屏蔽掉所有的内核printk打印,那么只需要把第一个数值调到最小值1或者0。

# echo 1 4 1 7 > /proc/sys/kernel/printk

或者

# echo 0 4 0 7 > /proc/sys/kernel/printk

printk打印举例

为了确认内核打印等级以及prink 参数对打印的分级,在驱动中加入如下代码。

每次insmod 、rmmod led模块时,根据打印等级的设置,得到不同的打印结果:

printk(KERN_EMERG " 1111111 KERN_EMERG\n");printk(KERN_ALERT " 2222 KERN_ALERT\n");printk(KERN_CRIT " 3333333 KERN_CRIT\n");printk(KERN_ERR " 44444444 KERN_ERR\n");printk(KERN_WARNING " 55555 KERN_WARNING\n");printk(KERN_NOTICE " 66666 KERN_NOTICE\n");printk(KERN_INFO " 77777 KERN_INFO\n");printk(KERN_DEBUG " 888888 KERN_DEBUG\n");printk(" 9999 no_fix\n");

操作:

一次性地设置编译内核源码时默认的打印级数:【它们在kernel/printk.c中定义】

echo 8 4 1 7 > /proc/sys/kernel/printk

insmod 模块后,打印信息如下:

1111111 KERN_EMERG

2222 KERN_ALERT

3333333 KERN_CRIT

44444444 KERN_ERR

55555 KERN_WARNING

66666 KERN_NOTICE

77777 KERN_INFO

888888 KERN_DEBUG

9999 no_fix

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。