原创 关于printk

2012-4-4 12:12 2470 28 28 分类: 消费电子

 

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

一: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

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

 

文章评论0条评论)

登录后参与讨论
我要评论
0
28
关闭 站长推荐上一条 /2 下一条