曲径通幽论坛

标题: printk | 内核消息输出 [打印本页]

作者: beyes    时间: 2009-8-30 02:08
标题: printk | 内核消息输出
普通应用程序中输出消息使用 printf()函数,而利用 scanf() 函数接收用户的输入。内核不接收用户的输入,没有对应的 scanf() 函数,但是使用 printk() 函数输出运行状态。

printk() 函数是创建并测试驱动程序的最有效调试工具。调试内核和设备驱动的方法虽然较多,但考虑到 printk() 的方便性,实际调试过程中基本使用 printk() 函数。该函数的使用方法和 printf() 基本相似,但具有输出和管理内核消息的特性。

printk() 函数向外部输出内核的状态,即内核消息。该内核消息为了表示多数系统的运行状态,主要输出相关错误及其他系统的变化。由管理员记录或保存内核消息,而大容量系统生成的消息量也十分惊人,因此管理员分类管理内核消息。此时根据内核消息的重要程度定义级数,并表现在内核消息的头位置,这称为“记录级别”。

记录级别在 printk()  函数上传送的字符串头文字上使用 "<1>" 等数字标记级别。该级别的有效范围为输出 "\n" 对应字符。但是表示级别时并不提倡使用 "<1>" 这样的形态。执行 printk() 函数时,虽然将字符串起始位置 "<" 和 “>" 之间的数字分为级别,但比起直接使用数字,使用 linux/kernel.h 文档上的定义的声明会更加有效,如下表所示:


含义
#define KERN_EMERG
"<0>"  /*系统不运行*/
#define KERN_ALERT
"<1>" /*总是输出*/
#define KERN_GRIT
"<2>"   /*关键信息*/
#define KERN_ERR
"<3>"   /*error信息*/
#define KERN_WARNING
"<4>"   /*警告信息*/
#define KERN_NOTICE
"<5>"   /*正常的信息*/
#define KERN_INFO
"<6>"   /*系统信息*/
#define KERN_DEBUG
"<7>"  /*调试信息*/

printk(KERN_INOF "System ok\n");

printk ("<6>" "System ok\n");
printk ("<6>System ok\n")'
含义相同。

不标识级别时,默认为 KERN_WARNING 级别,如:
printk (KERN_WARNING "System ok\n");
printk ("<4>" "System ok\n");
printk ("<4>System ok\n");
printk ("System ok\n");
上面 4 句都是一样的意思。注意,自定义语句和内核级别标识之间没有逗号分隔!




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2