内核中的printk, <0>的优先级最高,<7>优先级最低

原创 2015年11月20日 17:24:42

内核中的printk


printkprintf的用法是差不多的,最大的区别就是printk可以指定打印的优先 级。另外一个区别就是,printf只用在用户态,printk用于内核态。


/* printk's without a loglevel use this.. */

#define DEFAULT_MESSAGE_LOGLEVEL CONFIG_DEFAULT_MESSAGE_LOGLEVEL //menuconfig 可配置


/* We show everything that is MORE important than this.. */
#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */


int console_printk[4] = {
DEFAULT_CONSOLE_LOGLEVEL, /* console_loglevel */  -可在运行后修改 
DEFAULT_MESSAGE_LOGLEVEL, /* default_message_loglevel */ 
MINIMUM_CONSOLE_LOGLEVEL, /* minimum_console_loglevel */
DEFAULT_CONSOLE_LOGLEVEL, /* default_console_loglevel */

};

/dav # cat /proc/sys/kernel/printk
10      1       1       7
/dav # echo 8 > /proc/sys/kernel/printk
/dav # cat /proc/sys/kernel/printk
8       1       1       7
/dav # echo 10 > /proc/sys/kernel/printk
/dav # cat /proc/sys/kernel/printk
10      1       1       7


下面由程序讲解 

/*2nd_module/2nd*/

1 #include

2 #include

3

4 static int __init test_init(void)

5 {

        printk("hello world!\n");

        printk("<0>" "hello world! 0\n");

        printk("<1>" "hello world! 1\n");

        printk("<2>" "hello world! 2\n");

10       printk("<3>" "hello world! 3\n");

11       printk("<4>" "hello world! 4\n");

12       printk("<5>" "hello world! 5\n");

13       printk("<6>" "hello world! 6\n");

14       printk("<7>" "hello world! 7\n");

15       return 0;

16 }

17

18 static void __exit test_exit(void)

19 {

20         printk("good bye!\n");

21 }

22

23 module_init(test_init);

24 module_exit(test_exit);

25

26 MODULE_LICENSE("GPL");

27 MODULE_AUTHOR("xiao bai");

28 MODULE_VERSION("1.0");


编译后加载模块,发现输出内容为:

[root: 2nd]# insmod test.ko

hello world!

hello world! 0

hello world! 1

hello world! 2

hello world! 3

hello world! 4

hello world! 5

hello world! 6


输出唯独缺少了最后一个"hello world! 7",这是因为printk输出优先级的导致 的。printk的优先级如下,在内核目录下inxlude/linux/kernel.h下有记录:

91 #define KERN_EMERG "<0>" /* system is unusable */

92 #define KERN_ALERT "<1>" /* action must be taken immediately */

93 #define KERN_CRIT "<2>" /* critical conditions */

94 #define KERN_ERR "<3>" /* error conditions */

95 #define KERN_WARNING "<4>" /* warning conditions */

96 #define KERN_NOTICE "<5>" /* normal but significant condition */

97 #define KERN_INFO "<6>" /* informational */

98 #define KERN_DEBUG "<7>" /* debug-level messages */

其中<0>的优先级最高,<7>优先级最低。上面的printk语句的优先级都可以用字符 串代替,如下面两句是同等作用的:

p { margin-bottom: 0.21cm; }

printk("<3>" "hello world! 3\n");

printk(KERN_ERR "hello world! 3\n")

如果调用printk使用的优先级低于或等于控制台的默认优先级,就不能被输出到 控制台终端上显示,所以在minicom界面中看不到最后一句的输出。

按照以上的推测,可以得到两个结论:

一、如果不指定prinfk的优先级,prinfk的默认优先级比控制台的优先级高,所 以才能显示在控制台上。

二、控制台的优先级是6,因为低于6优先级的语句不能打印出来。


printk的默认优先级在内核目录kernel/printk.c定义:

47 /* printk's without a loglevel use this.. */

48 #define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */

49

50 /* We show everything that is MORE important than this.. */

51 #define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */

52 #define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG*/

文件中定义了printk的默认输出优先级为4,并定义了一般使用的最大和最小优先 级17


而终端控制台的输出优先级配置在文件/proc/sys/kernel/printk中:

[root: /]# cat /proc/sys/kernel/printk

7 4 1 7

7 4 1 7分别是:

7console_loglevel //这个就是控制台的默认优先级

4default_message_loglevel // 这个是printk的默认输出优先级

1minimum_console_level

7default_console_loglevel


可以通过修改该文件使所有优先级的消息都显示出来。

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


注意的是,即使没有显示在控制台的内核消息,也会追加到/var/log/messages,通过查看/var/log/messages就能看到。



版权声明:本文为博主原创文章,未经博主允许不得转载。文章转载只能用于非商业性质,且不能带有虚拟货币、积分等附加条件;转载必须注明出处。

printk() 使用说明

内核通过 printk() 输出的信息具有日志级别,日志级别是通过在 printk() 输出的字符串前加一个带尖括号的整数来控制的,如 printk("Hello, world!/n");。内核中共提...
  • iczyh
  • iczyh
  • 2008年10月27日 20:31
  • 3927

调整内核printk的打印级别

http://blog.csdn.net/tonywgx/article/details/17504001 有时调试内核模块,打印信息太多了,可以通过修改/proc/sys/kernel...
  • FoxBryant
  • FoxBryant
  • 2016年12月27日 14:49
  • 1128

printk的使用

1、基本原理 (1)在UBOOT里设置console=ttySAC0或者console=tty1 这里是设置控制终端,tySAC0 表示串口, tty1 表示lcd (2)内核用printk打印...
  • kehyuanyu
  • kehyuanyu
  • 2014年05月23日 14:29
  • 976

printk

在编写应用程序时,我们可以通过printf打印输出一些信息用来调试程序,Linux内核也提供了类似的函数printk,和printf不同的是,printk提供了输出日志级别,日志级别有: KERN_E...
  • mcgrady_tracy
  • mcgrady_tracy
  • 2013年07月20日 23:29
  • 1553

Printk打印优先级设定

# cat /proc/sys/kernel/printk 7       4       1      7 上面显示的4个数据分别对应: 控制台日志级别:优先级高于该值的消息将被打印至控制台,...
  • tangcong29
  • tangcong29
  • 2015年09月27日 10:16
  • 504

printk与内核日志打印优先级设置

1. 控制台的日志优先级 #define KERN_EMERG                  ""       /* 致命级:紧急事件消息,系统崩溃之前提示,表示系统不可用   */ #defi...
  • bytxl
  • bytxl
  • 2015年03月30日 16:45
  • 1026

printk()

五  printk() 内核提供的格式化打印函数。 1  printk函数的健壮性       健壮性是printk最容易被接受的一个特质,几乎在任何地方,任何时候内核都可以调用它...
  • luckywang1103
  • luckywang1103
  • 2014年07月29日 21:40
  • 899

Linux printk and log level

只有当printk打印信息时的loglevel小于console loglevel的值(即:优先级高于console loglevel),这些信息才会被打印到console上。 改变console...
  • zifeng274059226
  • zifeng274059226
  • 2016年01月09日 18:46
  • 169

printk优先级

printk是在内核中运行的向控制台输出显示的函数,Linux内核首先在内核空间分配一个静态缓冲区,作为显示用的空间,然后调用sprintf,格式化显示字符串,最后调用tty_write向终端进行信息...
  • mao0514
  • mao0514
  • 2014年03月21日 09:42
  • 1395

css中使用!important优先级最高问题

我们都知道在css属性在不同的地方有不同的优先级,但是我们可以在css定义中的用!important限定的定义最高优先级。 下面我通过四种情况做个实例: 下面是实例代码代码里有对应的说明: ...
  • bymyself11
  • bymyself11
  • 2016年07月28日 14:49
  • 5058
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内核中的printk, <0>的优先级最高,<7>优先级最低
举报原因:
原因补充:

(最多只允许输入30个字)