Loglevels
printk()和printf()一个最主要的区别就是前者可以指定一个记录级别。内核根据这个级别来判断是否在终端上打印消息。内核把级别比某个特定值低的所有消息显示在终端上。
可以通过下面这种方式指定一个记录级别:
printk(KERN_WARNING “This is a warning!\n”);
printk(KERN_DEBUG “This is a debug notice!\n”);
printk(“ I did not specify a loglevel!\n”);
KERN_WARING和KERN_DEBUG都是<linux/kernel.h>中的简单宏定义。它们扩展开是像“<4>”或“<7>”这样的字符串,加进printk()函数要打印的消息的开头。内核用这个指定的记录等级和当前终端的记录等级console_loglevel来决定是不是向终端上打印。表1列举了所有可供使用的记录等级。
表1 可供使用的记录等级
| 记录等级 |
描述 |
| KERN_EMERG |
一个紧急情况 |
| KERN_ALERT |
一个需要立即被注意到的错误 |
| KERN_CRIT |
一个临界情况 |
| KERN_ERR |
一个错误 |
| KERN_WARNING |
一个警告 |
| KERN_NOTICE |
一个普通的,不过也有可能需要注意的情况 |
| KERN_INFO |
一条非正式的消息 |
| KERN_DEBUG |
一条调试信息——一般是冗余信息 |
如果你没有特别指定一个记录等级,函数会选用默认的DEFAULT_MESSAGE_LOGLEVEL,现在默认等级是KERN_WARNING。由于这个默认值将来存在变化的可能性,所以还是应该给你自己的消息指定一个记录等级。
内核将最重要的记录等级KERN_EMERG定为“<0>”,将无关紧要的记录等级“KERN_DEBUG”定为“<7>”。举例来说,当编译预处理完成之后,前例中的代码实际被编译成如下格式:
printk(“<4> This is a warning!\n”);
printk(“<7>This is a debug notice!\n”);
printk(“<4>I did not specify a loglevel!\n”);
怎样给你调用的printk()赋记录等级完全取决于你自己。那些正式的、需要你保持的消息应该有合适的记录等级。但是那些当你试图解决一个问题时加得到处都是的调试信息——必须承认,我们都这么干而且也确实行得通——可以按照你的想法赋给记录等级。一种选择是保持你的终端的默认记录等级不变,给你的所有调试信息KERN_CRIT或更低的等级。相反,你也可以给你的所有调试信息KERN_DEBUG等级,而调整你终端的默认记录等级。两种方法各有利弊,自己拿主意吧。
BTW:我的毕业设计的学生在调试内核代码时,遇到不少问题,在此把《LDK》中调试一章的内容专门贴出来,给大家参考。
