新闻  |   论坛  |   博客  |   在线研讨会
关于printk
xiajiashan | 2012-08-28 16:29:07    阅读:1123   发布文章

 

 

作者:下家山(转载,请注明作者,请尊重原创)

一:printk等级

Printk是一个带打印等级(loglevel)的内核打印语句。

Linux内核根据问题的严重程度定义了八种等级(loglevel)

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

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

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

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

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

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

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

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

值越小等级越高。

(见include/linux/kernel.h linux2.6.15)

二:printk输出方式

Printk的输出方式有两种:syslog(日志)和console(控制台)。我们通常在调试驱动时一般

把控制台定向到了串口,然后通过串口显示到串口终端上。

2.1 通过console输出

当loglevel小于console_loglevel时,消息才能被打印到控制台上(也就能在串口终端看到内容了)。

2.2 通过日志查看

那么当loglevel大于console_loglevel,消息保存在哪里呢?

如果系统运行了klogd和syslogd,则无论console_loglevel为何值,内核消息都将追加到/var/log/messages中。如果klogd没有运行,消息不会传递到用户空间,只能查看/proc/kmsg。

也就是说messages或kmsg中会显示所有的打印信息。

三:console_loglevel值为多少

Console_loglevel同样定义在include/linux/kernel.h中

#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_printk定义在哪里呢?

(见kernel/printk.c)

#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */

/* 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 */

};

这样 console_loglevel值就为7

四:测试程序

#include

 

#include

#define PRINTM_MSG(msg) printk(KERN_DEBUG msg)

#define PRINTM(level,msg...) PRINTM_##level(msg)

#define pr_debug(arg) printk(KERN_INFO arg)

static int printk_test_init(void)

{

printk(KERN_EMERG "Hello0\n");

printk(KERN_ALERT "Hello1\n");

printk(KERN_CRIT "Hello2\n");

printk(KERN_ERR "Hello3\n");

printk(KERN_WARNING "Hello4\n");

printk(KERN_NOTICE "Hello5\n");

printk(KERN_INFO "Hello6\n");

printk(KERN_DEBUG "Hello7\n");

printk(KERN_DEBUG "Hello7\n");

printk(KERN_DEBUG "%s\n","Hello7-1");

PRINTM_MSG("No external FW image\n");

PRINTM(MSG, "No external FW image\n");

pr_debug("success!\n") ;

return 0;

}

static void printk_test_exit(void)

{

printk(KERN_EMERG"Goodbye\n");

}

module_init(printk_test_init);

module_exit(printk_test_exit);

五:测试结果
222.jpg

转载:请注明,作者,下家山 请尊重原创!

 

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
02年接触ARM和ucos,开发过有线和无线图像报警器,IPCamera,人脸识别系统,OCR识别系统,指纹识别系统,05年开始从事Linux及Rtems下WiFi,camera,Ethernet等驱动开发工作,专做嵌入式linux培训,致力于把我十年来的研发经验传授给每一个学员,招人的可以找我,ximenpiaoxue4016@sina.com
推荐文章
最近访客