printk的定向问题
2015-12-22 16:05
176 查看
相信很多人在第一次接触到linux驱动程序的时候都遇到了两个基本的问题。 1.不知道怎么编译才能编译出linux模块程序。 2.写自己第一个linux驱动程序的时候,发现printk并不会向我们想想的那样把log信息显示在我们的终端上。 我自己也同样遇到了两个问题。 现在和大家分享下我从中学到的,当然肯定是不全面的。 1.linux模块的编译方法。 如果是一个简单的测试程序那么Makefile中只需要一个简单的语句就行了,就用LDD3中的hello world模块测试程序举例,Makefile文件中只需要一句obj-m
:= hello.o就行了。 然后编译模块: make -C /kernel M=`pwd` modules 其中/kernel是你现在运行的内核的源文件地址。 “M=”之后是你的模块程序所在的地址。 2.printk()打印的log并没有显示在我们的终端上。 原因1:printk()有一个控制日志级别的字段,如果该字段的日记级别高于console默认的日志级别那么才会打印出来(数值越小日志级别越高,分为从0-7共计8个日志级别)。有一种简单的改变当前终端的日志级别的方法,echo 8 > /proc/sys/kernel/printk。理论上这样printk就能输出到终端了。但是我的没有。
原因2:syslogd守护进程的规则有问题,/etc/syslog.conf中定义了一些列规则,其中就包含数内核消息的处理规则,fedora中的syslogd守护进程叫做rsyslogd,相应它的规则配置文件叫rsyslog.conf,其中有一行”#kern.* /dev/console“它的意思是把所有日志级别的内核log都输出到/dev/console即我们的终端。我们只需要把该行的'#'去掉,重启,理论上那么内核log (printk()输出也是内核log)就会输出到终端了。但是我的还是不能。 原因3:系统中同时有klogd和syslogd守护进程那么不管日志级别是什么都不能输出到终端。
如果不能在终端上看到printk的输出,那么可以通过查看/var/log/messages文件,或运行dmesg命令查看,或查看/proc/kmsg文件获得信息,或是通过ctrl+alt+f2~f6进入系统文本模式装载模块,这样也可以看到prink()输出的信息,当然这里就准确对应原因1中所讲的规则。 最后说一下syslogd、直接通过/proc/kmsg、和dmesg读取printk输出缓冲区的区别: syslogd:读取了缓冲区中的数据,不会删除缓冲区中的数据。 直接读取/proc/kmsg:读取了缓冲区中的数据后,将缓冲区中的数据删除(klogd默认就是采用这种方法)。
dmesg:在不刷新缓冲区的情况下获得缓冲区的内容,并将内容返回给stdout。 本文里的知识来至LDD3,和一位网友的博客(http://www.cnitblog.com/textbox/archive/2009/10/13/61785.html)。
:= hello.o就行了。 然后编译模块: make -C /kernel M=`pwd` modules 其中/kernel是你现在运行的内核的源文件地址。 “M=”之后是你的模块程序所在的地址。 2.printk()打印的log并没有显示在我们的终端上。 原因1:printk()有一个控制日志级别的字段,如果该字段的日记级别高于console默认的日志级别那么才会打印出来(数值越小日志级别越高,分为从0-7共计8个日志级别)。有一种简单的改变当前终端的日志级别的方法,echo 8 > /proc/sys/kernel/printk。理论上这样printk就能输出到终端了。但是我的没有。
原因2:syslogd守护进程的规则有问题,/etc/syslog.conf中定义了一些列规则,其中就包含数内核消息的处理规则,fedora中的syslogd守护进程叫做rsyslogd,相应它的规则配置文件叫rsyslog.conf,其中有一行”#kern.* /dev/console“它的意思是把所有日志级别的内核log都输出到/dev/console即我们的终端。我们只需要把该行的'#'去掉,重启,理论上那么内核log (printk()输出也是内核log)就会输出到终端了。但是我的还是不能。 原因3:系统中同时有klogd和syslogd守护进程那么不管日志级别是什么都不能输出到终端。
如果不能在终端上看到printk的输出,那么可以通过查看/var/log/messages文件,或运行dmesg命令查看,或查看/proc/kmsg文件获得信息,或是通过ctrl+alt+f2~f6进入系统文本模式装载模块,这样也可以看到prink()输出的信息,当然这里就准确对应原因1中所讲的规则。 最后说一下syslogd、直接通过/proc/kmsg、和dmesg读取printk输出缓冲区的区别: syslogd:读取了缓冲区中的数据,不会删除缓冲区中的数据。 直接读取/proc/kmsg:读取了缓冲区中的数据后,将缓冲区中的数据删除(klogd默认就是采用这种方法)。
dmesg:在不刷新缓冲区的情况下获得缓冲区的内容,并将内容返回给stdout。 本文里的知识来至LDD3,和一位网友的博客(http://www.cnitblog.com/textbox/archive/2009/10/13/61785.html)。
相关文章推荐
- HDOJ 1286 找新朋友
- 用PickerView仿电台频道切换
- Eclipse添加和查看书签
- iOS:你App的设置做对了吗?
- 手机自动化测试:appium源码分析之bootstrap十二
- Class.forName() ClassLoader.loadClass () 区别小议
- 关于DRM文件
- 第七章 注解式控制器的数据验证、类型转换及格式化(1)
- Python学习笔记——函数式编程
- delete 和truncate 区别
- 在 Cent OS 6.5 中安装桌面环境
- 在广播中启动activity或者dialog
- 31.Evaluate the following SQL commands:
- GeoHash核心原理解析及java代码实现(转)
- 面对对象语言的三大特征
- 数据库4-修改数据表
- EasyUI序列化提交学习总结
- Web Logic 中间件(一)
- 常用的抽象类与实现类
- 嵌入式Linux串口应用编程基础知识