Linux内核模块-printk函数(四)

来源:互联网 发布:网络借贷p2p系统 编辑:程序博客网 时间:2024/05/01 14:37
1.先看程序的头文件(参考hello.c)
 # include <linux/module.h> /* Need by all modules */
# include <linux/kernel.h> /* Need for HERN_INFO */
# include <linux/init.h>   /* Need for the macros */

2.解析printk函数
# include <linux/kernel.h> /* Need for HERN_INFO */

  •  上面已经说了,我们在内核 编程时所用的库函数和在用户态下的是不一样的。 printk 是内核态信息打印函数,功能和比准   库的 printf  类似。  printk  还有信息打印级别。
  • 现在我们来看一下 printk() 函数的原型:

int printk(const char *fmt, ...)

消息打印级别:

fmt---- 消息级别:

#define KERN_EMERG "<0>" /* 紧急事件消息,系统崩溃之前提示,表示系统不可用 */

#define KERN_ALERT "<1>" /* 报告消息,表示必须立即采取措施 */

#define KERN_CRIT "<2>" /* 临界条件,通常涉及严重的硬件或软件操作失败 */

#define KERN_ERR "<3>" /* 错误条件,驱动程序常用   KERN_ERR 来报告硬件的错误 */

#define KERN_WARNING "<4>" /* 警告条件,对可能出现问题的情况进行警告 */

#define KERN_NOTICE "<5>" /* 正常但又重要的条件,用于提醒。常用于与安全相关的消息 */

#define KERN_INFO "<6>" /* 提示信息,如驱动程序启动时,打印硬件信息   */

#define KERN_DEBUG "<7>" /* 调试级别的消息 */
说明:不同级别使用不同的字符串表示,数字越小,级别越高。

  • 为什么内核态使用 printk() 函数,而在用户态使用 printf() 函数。

printk() 函数是直接使用了向终端写函数 tty_write() 。而 printf() 函数是调用 write() 系统调用函数向标准输出设备写。所以在用户态(如进程 )不能够直接使用 printk() 函数,而在内核态由于它已是特权级,所以无需系统调用来改变特权级,因而能够直接使用 printk() 函数。 printk是内核输出,在终端是看不见的。我们可以看一下系统日志。

但是我们可以使用命令: cat /var/log/messages ,或者使用 dmesg 命令看一下输出的信息。

相关链接:http://blog.csdn.net/tigerjibo/article/details/6010997
0 0