Linux内核模块-printk函数(四)
2014-04-06 19:55
260 查看
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 是内核态信息打印函数,功能和比准 C 库的 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() 系统调用函数向标准输出设备写。所以在用户态(如进程 0 )不能够直接使用 printk() 函数,而在内核态由于它已是特权级,所以无需系统调用来改变特权级,因而能够直接使用 printk() 函数。 printk是内核输出,在终端是看不见的。我们可以看一下系统日志。
但是我们可以使用命令: cat /var/log/messages ,或者使用 dmesg 命令看一下输出的信息。
相关链接:http://blog.csdn.net/tigerjibo/article/details/6010997
# 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 是内核态信息打印函数,功能和比准 C 库的 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() 系统调用函数向标准输出设备写。所以在用户态(如进程 0 )不能够直接使用 printk() 函数,而在内核态由于它已是特权级,所以无需系统调用来改变特权级,因而能够直接使用 printk() 函数。 printk是内核输出,在终端是看不见的。我们可以看一下系统日志。
但是我们可以使用命令: cat /var/log/messages ,或者使用 dmesg 命令看一下输出的信息。
相关链接:http://blog.csdn.net/tigerjibo/article/details/6010997
相关文章推荐
- 深入浅出Linux设备驱动编程--Linux内核模块
- linux内核模块编程之入门(二)-编写带参数的中断模块
- linux内核模块遍历获取进程列表,使用list_entry()
- Linux内核模块编译指南
- 突破Linux内核模块校验机制
- 一个简单的Linux内核模块
- linux内核模块
- Linux内核模块自动加载机制
- Linux内核模块LKM的动态加载技术分析
- 在linux内核源代码中添加printk函数
- Linux内核模块模型面向对象分析
- linux内核模块编程5
- Linux内核模块与应用程序比较
- Linux内核模块与Makefile实例
- Makefile之Linux内核模块的Makefile写法分析
- 内核学习之一:Linux内核模块技术探秘
- linux内核模块
- Linux内核模块-The__init and __exit宏(三)
- linux内核模块的编译
- Linux内核模块编程