作者:下家山(转载,请注明作者,请尊重原创)
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的输出方式有两种:syslog(日志)和console(控制台)。我们通常在调试驱动时一般
把控制台定向到了串口,然后通过串口显示到串口终端上。
当loglevel小于console_loglevel时,消息才能被打印到控制台上(也就能在串口终端看到内容了)。
那么当loglevel大于console_loglevel,消息保存在哪里呢?
如果系统运行了klogd和syslogd,则无论console_loglevel为何值,内核消息都将追加到/var/log/messages中。如果klogd没有运行,消息不会传递到用户空间,只能查看/proc/kmsg。
也就是说messages或kmsg中会显示所有的打印信息。
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);
转载:请注明,作者,下家山 请尊重原创!
文章评论(0条评论)
登录后参与讨论