2015年(109)
分类:
2015-01-23 16:33:55
原文地址:内核printk有时能打印有时不能打印的问题 作者:myleeming
一条没有指定优先级的 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