Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1006701
  • 博文数量: 153
  • 博客积分: 4195
  • 博客等级: 上校
  • 技术积分: 2631
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-22 11:32
文章存档

2012年(7)

2010年(35)

2009年(111)

分类:

2009-07-02 11:48:28

今天在内核里面的一个函数打了一句prink();在串口控制台上竟然没有打印出来,从而引出了这个话题:
 
首先,我们先来看看printk和串口控制台的一些理论知识:

一条没有指定优先级的 printk 语句缺省是 DEFAULT_MESSAGE_LOGLEVEL, 在 kernel/printk.c 里指定作为一个整数. 在 2.6.10 内核中, DEFAULT_MESSAGE_LOGLEVEL 是 KERN_WARNING, 但是在过去已知是改变的.

基于记录级别, 内核可能打印消息到当前控制台, 可能是一个文本模式终端, 串口, 或者是一台并口打印机. 如果优先级小于整型值 console_loglevel, 消息被递交给控制台, 一次一行( 除非提供一个新行结尾, 否则什么都不发送 ). 如果 klogd 和 syslogd 都在系统中运行, 内核消息被追加到 /var/log/messages (或者另外根据你的 syslogd 配置处理), 独立于 console_loglevel. 如果 klogd 没有运行, 你只有读 /proc/kmsg ( 用 dmsg 命令最易做到 )将消息取到用户空间. 当使用 klogd 时, 你应当记住, 它不会保存连续的同样的行; 它只保留第一个这样的行, 随后是, 它收到的重复行数.

变量 console_loglevel 初始化成 DEFAULT_CONSOLE_LOGLEVEL, 并且可通过 sys_syslog 系统调用修改. 一种修改它的方法是在调用 klogd 时指定 -c 开关, 在 klogd 的 manpage 里有指定. 注意要改变当前值, 你必须先杀掉 klogd, 接着使用 -c 选项重启它. 另外, 你可写一个程序来改变控制台记录级别. 你会发现这样一个程序的版本在由 O' Reilly 提供的 FTP 站点上的 miscprogs/setlevel.c. 新的级别指定未一个整数, 在 1 和 8 之前, 包含 1 和 8. 如果它设为 1, 只有 0 级消息( KERN_EMERG )到达控制台; 如果它设为 8, 所有消息, 包括调试消息, 都显示.

简单的说,printk有一个等级,控制台也有一个等级,只有你的printk的等级小于控制台的等级才能在控制台输出,

其次:

但是我是使用的普通的printk函数,没有加任何等级,按照定义的话我应该使用默认等级,是4,而控制台等级一般不会去动它,它的等级是7,照理应该能输出的啊?进入/proc目录,cat了一下kmsg发现我的信息时存在的(并不是之前我换衣的会不会串口驱动写的不好),但是他上面的等级赫然显示的是7,why????

原因:

在我这句printk之前有一句printk(KERN_DEBUG "Calibrating delay loop... ");而且它没有加换行符,导致后面的printk也默认等级和它相同,也是KERN_DEBUG等级(7),所以当然不能显示啦。

结论:

以后再有这种情况,可是先在不能print的printk语句前加一句printk,记住使用默认等级,再加换行符!

启示:

软件的任何现象都是可以解释的,切忌!

ps: 可以通过文本文件/proc/sys/kernel/printk的访问来读取和修改控制台的日志级别。

echo 8 > /proc/sys/kernel/printk

阅读(4004) | 评论(0) | 转发(3) |
给主人留下些什么吧!~~