内核中打印信息学习

在 Linux 中,内核打印语句 printk()会将内核信息输出到内核信息缓冲区中。内核
信息缓冲区是一个环形缓冲区(ring buffer),因此,如果塞入的消息过多,就会将之
前的消息冲刷掉。

Linux 的 klogd 进程(一个系统守护进程,它截获并且记录下 Linux 内核日志信息)
会通过/proc/kmsg 文件读取缓冲区,一旦读取完成,内核信息便从缓冲区中被删除。之后,
klogd 守护进程会将读取的内核信息派发给 syslogd 守护进程(syslogd 记录下系统里所有
提供日志记录的程序给出的日志和信息内容,每一个被记录的消息至少包含时间戳和主
机名),syslogd 这个守护进程会根据/etc/syslog.conf 将不同的服务产生的日志记录到不同
的文件中。
用户也可以直接使用“cat /proc/kmsg”命令来显示内核信息,但是,由于/proc/kmsg
是一个“永无休止的文件”,因此,“cat /proc/kmsg”的进程只能通过“Ctrl+C”或 kill
终止。另外,使用 dmesg 命令也可以直接读取 ring buffer 中的信息。
printk()定义了 8 个消息级别,分为级别 0~7,越低级别(数值越大)的消息越不
重要,第 0 级是紧急事件级,第 7 级是调试级,代码清单 22.3 所示为 printk()的级别
定义。
在这里插入图片描述
通过/proc/sys/kernel/printk文件可以调节 printk的输出等级,该文件有 4 个数字值,
如下所示:
? 控制台日志级别:优先级高于该值的消息将被打印至控制台。
? 默认的消息日志级别:将用该优先级来打印没有优先级的消息。
? 最低的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级)。
? 默认的控制台日志级别:控制台日志级别的默认值。
上述 4 个值的默认设置为 6、4、1、7。
通过如下命令可以使得 Linux 内核的任何 printk 都被输出:
echo 8 > /proc/sys/kernel/printk

在设备驱动中,我们经常需要输出调试或系统信息,尽管可以直接采用
printk("<7>debug info …\n")方式的 printk()语句输出,但是通常可以使用封装了 printk()
的更高级的宏,如 pr_debug()、dev_debug()等。

1 #ifdef DEBUG
2 #define pr _ debug(fmt,arg...) \
3 printk(KERN _ DEBUG fmt,##arg)
4 #else
5 static inline int  _ _ attribute _ _ ((format (printf, 1, 2))) pr _ debug(const
char * fmt, ...)
6 {
7 return 0;
8 }
9 #endif
10
11 #define pr _ info(fmt,arg...) \
12 printk(KERN _ INFO fmt,##arg)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值