linux 驱动调试

红为网络 2012-09-04

开始自己的第一个驱动程序时,大家应该都是从hello,world开始的吧,是否会遇到虽然我们加载模块成功了,却没有输出hello,world的情况呢,我就遇到了,找了下资料,原来是printk与控制台在作怪。

2010-05-31 16:13:09  :刚才又去查了下资料,下面的方法不一定解决问题,原因是:

转自:http://forum.ubuntu.org.cn/viewtopic.php?f=97&t=127667&start=0

      printk 是内核的调用接口,它在系统init之前,把消息写往控制台,但是一旦系统init之后,便改写到系统的日志中。这样做的好处不言而喻的,如果内核在任何的时候都可以写信息到控制台,那控制台一定会被这样的信息淹没,而无法工作。printk的实现很简单,就是在有了日志消息后,首先申请控制台的信号量,如果申请到,则调用控制台写方法,写控制台。当linux初始化完成的时候,会在init之前打开控制台,此后,printk便无法申请到信号量,而把消息组织为skb发往特定的netlink缓冲区,由klogd读出,写向/var/log/messages 文件中。

    根据上面描述的,我用的是ubuntu,我们在图形界面gnome下的控制台不能显示我们的printk输出,原因就是上面所说的,printk函数是系统内核调用,在init进程启动后就申请不到控制台,所以调用它就没能在图形界面下的控制台输出。那么我们编写驱动程序,有要用printk来调试的时候该怎么办呢?相信还有另外的方法来重定向输出吧,相信linux 的强大,继续学习中……。不过就算不能输出也没关系,我们可以用命令:   cat /var/log/messages来查看printk的输出,或者命令:dmesg  ,或者命令:cat  /var/log/syslog ,都可以,看哪种好用就用吧。

(2010-05-3117:52:07在这里插一句,输出问题,我终于解决拉!!看这里:http://blog.csdn.net/fantasylf/archive/2010/05/31/5637414.aspx)

相关推荐