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_MIN     1 
#define CONSOLE_LOGLEVEL_DEFAULT 7 

-------------------------------------------------------------------------
// kernel/printk.c

int 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.h

extern 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

猜你喜欢

转载自blog.csdn.net/u014470361/article/details/81302002