前言
这篇博客来聊一聊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命令