专栏中心

EEPW首页 > 专栏 > 关于printk

关于printk

发布人:xiajiashan 时间:2012-08-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

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

 

 

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

水平喷锡简介

资源下载 2007-02-09

SigmaStar的SSD20x处理器Nand Flash读写问题排查

网络与存储 2026-01-26

华中科技大学控制系科技创新基地

视频 2010-02-01

Microsoft发布首款机器人模型,旨在提升物理人工智能,力图将机器人从生产线中解放出来

新型“智能”芯片可大幅节能提速

EDA/PCB 2026-01-26

凯越08智能车展示

视频 2010-02-01

华中科技大学控制系科技创新基地

视频 2010-02-01

为什么碰到几个做嵌入式开发的人都说做 MCU 开发没什么意思,要做 MPU (Linux) 开发?

嵌入式系统 2026-01-26

Corvex部署NVIDIA H200 GPU以支持生产型人工智能

古尔曼:苹果全新Siri最快下月随iOS 26.4测试版亮相

“机器人永不疲倦”:现代解释了为何其波士顿动力Atlas机器人准备接管工厂,却不愿接管你的家

数据中心的下一个胜负手:跳出AI芯片

EDA/PCB 2026-01-26

马斯克确认特斯拉旗下自动驾驶无人出租车Cybercab 4月量产

双车比拼 智能小车 寻迹小车

视频 2010-02-01

南通大学 飞思卡尔 智能车 SWT队 宣传视频

视频 2010-02-01

类人机器人即将接受考验

更多 培训课堂
更多 焦点
更多 视频

技术专区