内核中的printk, <0>的优先级最高,<7>优先级最低
内核中的printk
printk与printf的用法是差不多的,最大的区别就是printk可以指定打印的优先 级。另外一个区别就是,printf只用在用户态,printk用于内核态。
/* printk's without a loglevel use this.. */
DEFAULT_MESSAGE_LOGLEVEL CONFIG_DEFAULT_MESSAGE_LOGLEVEL //menuconfig 可配置};
/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 {
6 printk("hello world!\n");
7 printk("<0>" "hello world! 0\n");
8 printk("<1>" "hello world! 1\n");
9 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,并定义了一般使用的最大和最小优先 级1和7。
而终端控制台的输出优先级配置在文件/proc/sys/kernel/printk中:
[root: /]# cat /proc/sys/kernel/printk
7 4 1 7
7 4 1 7分别是:
7:console_loglevel //这个就是控制台的默认优先级
4:default_message_loglevel // 这个是printk的默认输出优先级
1:minimum_console_level
7:default_console_loglevel
可以通过修改该文件使所有优先级的消息都显示出来。
[root: /]# echo 8 > /proc/sys/kernel/printk
注意的是,即使没有显示在控制台的内核消息,也会追加到/var/log/messages,通过查看/var/log/messages就能看到。
文章来源: blog.csdn.net,作者:悟空胆好小,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/xushx_bigbear/article/details/49949631
- 点赞
- 收藏
- 关注作者
评论(0)