前言
这篇博客来聊一聊Linux内核打印。
嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程,未来预计四个月将高强度更新本专栏,喜欢的可以关注本博主并订阅本专栏,一起讨论一起学习。现在关注就是老粉啦!
目录
- 前言
- 1. dmesg指令——查看内核打印信息
- 1.1 dmesg基本使用
- 1.2 dmesg进行关键词查找
- 1.3 实时打印最后N行
- 1.4 kmsg
 
- 2. printk函数
- 查看内核打印等级
- 调整内核打印等级
- 使用方法
 
- 问题
- 参考资料
1. dmesg指令——查看内核打印信息
1.1 dmesg基本使用
   dmesg是Linux系统重查看内核日志的使用工具,允许查看系统内核的输出消息,包括引导信息,硬件检测,设备驱动和系统错误等,通过dmesg可以追踪系统启动过程的事件,排查故障。
   我们在启动linux系统的时候会有一连串的信息打印出来,如果我们后续想要再看一次启动的信息,就可以用dmesg回显一下,内核将打印的信息存储到ring buffer中,我使用的是MobaXterm,在其中的控制台输入dmesg查看ring buffer中存储的启动信息:

回车后就会显示如下的信息,就会打印出启动的信息:

后面可以跟一些参数,常用的参数如下所示:
-C,清除内核环形缓冲区(ring buffer)
-c ,读取并清除所有消息
-T,显示时间戳
   使用dmesg -c打印内核信息后,再次输入dmesg就读不到了,因为被清除了

1.2 dmesg进行关键词查找
   dmesg可以与grep组合使用,查找关键词,比如我们要查找与cpu相关的信息,可以使用如下命令,不区分大小写查找CPU相关信息:
dmesg | grep -i cpu

1.3 实时打印最后N行
实时监控查看日志末尾N行可以用以下指令,查看末尾的N行,结果是一致显示的,每隔2s显示一次
watch “dmesg | tail -5”

1.4 kmsg
内核把所有的打印信息会输出到循环缓冲区log_buf,为了方便在用户控件读取内核打印信息,Linux内核驱动将该循环缓冲区映射到/proc目录下的文件节点kmsg中,通过cat指令读取log Buffer时可以不断等待新的log,所以访问/pro/kmsg的方式适合长时间读取log。
使用以下指令读取kmsg,没有新的内核打印信息时会阻塞。
cat /proc/kmsg
   如下就是处于阻塞状态:
 
2. printk函数
查看内核打印等级
内核日志的打印由相应的打印等级来控制,可以通过调整内核打印等级来控制打印日志的输出:
cat /proc/sys/kernel/printk

   这四个数字分别对应 console_loglevel、default_message_loglevel、minimum_console_loglevel、default_console_loglevel
| 终端打印类型 | 对应类型说明 | 
|---|---|
| console_loglevel | 只有当printk打印消息的log优先级高于console_loglevel时,才能输出到终端上 | 
| default_message_loglevel | printk打印消息时默认的log等级 | 
| minimum_console_loglevel | console_loglevel 可以被设置的最小值 | 
| default_console_loglevel | console_loglevel的缺省值 | 
   printk的四个等级意味着,只有优先级高于KERN_DEBUG(7)的打印消息才能输出到终端
调整内核打印等级
通过echo指令进行修改,如下所示,将当前的日志级别修改为4,最后通过cat查看发现第一个数变成了4:
echo 4 > /proc/sys/kernel/printk

也可以一次性改变多个值,如下所示:
echo 4 2 0 6 > /proc/sys/kernel/printk

这种方法重启内核后会重新变为 7 4 1 7,也就是说重启内核后需要重新修改。
使用方法
   printk函数就类似于printf函数,不过printf函数用于应用层,是用户空间的打印函数,printk是内核空间的打印函数。
   可以利用printk函数打印一些内核的提示信息。
printk("led driver and device has matched!\r\n");
问题
   显示invalid option

有大佬知道这个问题是为什么嘛,求指导 T_T
参考资料
[1] 深入了解Linux下的dmesg指令:查看系统内核日志的利器
[2] Linux命令之dmesg命令