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

来源:互联网 发布:java前端要学什么 编辑:程序博客网 时间:2024/05/21 08:50

内核中的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就能看到。



0 0