本手册的实验都是在buildroot系统上完成的,由于buildroot系统已经设置了相应的打印等级,所以驱动的相关打印都能正常显示在串口终端上,如果将实验系统换成了ubuntu,然后加载同样的驱动,会发现打印信息不见了,这一现象的基本原因就是内核打印等级不同,那打印等级是如何修改的呢,查看打印等级的方式又有哪些呢,就让我们进入本章节的学习吧!
32.1 方法一:dmseg 命令
在终端使用dmseg命令可以获取内核打印信息,该命令的具体使用方法如下所示:
dmesg命令
**英文全称:**display message(显示信息)
**作用:**kernel 会将打印信息存储在 ring buffer 中。可以利用 dmesg命令来查看内核打印信息。
常用参数:
-C,–clear清除内核环形缓冲区
-c,—-read-clear读取并清除所有消息
-T,–显示时间戳
提示:dmesg命令也可以与grep命令组合使用。如查找待用usb关键字的打印信息,就可以使用如下命令:dmseg | grep usb
首先在串口终端使用“dmseg”命令,可以看见相应的内核打印信息已经加载了出来,如下图(图 32-1)所示:
图 32-1
然后使用以下组合命令查找nfs相关的打印信息,如下图(图 32-2)所示:
dmesg | grep nfs
图 32-2
至此关于dmesg命令就讲解演示完成了。
32.2 方法二:查看kmsg文件
内核所有的打印信息都会输出到循环缓冲区 ‘log_buf’,为了能够方便的在用户空间读取 内核打印信息,Linux内核驱动将该循环缓冲区映射到了/proc目录下的文件节点kmsg。通过 cat或者其他应用程序读取Log Buffer的时候可以不断的等待新的log,所以访问/proc/kmsg 的方式适合长时间的读取log,一旦有新的log就可以被打印出来。
首先使用以下命令读取kmsg文件,在没有新的内核打印信息时会阻塞,如下图(图 32-3)所示:
cat /proc/kmsg
图 32-3
然后在该设备的其他终端加载任意有打印信息的驱动文件(这里使用的是ssh),如下图(图 32-4)所示:
图 32-4
在串口终端中可以看到对应驱动的打印信息就被打印了出来,如下图(图 32-5)所示:
图 32-5
32.3 方法三:调整内核打印等级
内核的日志打印由相应的打印等级来控制,可以通过调整内核打印等级来控制打印日志的输出。使用以下命令查看当前默认打印等级,如下图(图 32-6)所示:
cat /proc/sys/kernel/printk
图 32-6
可以看到内核打印等级由四个数字所决定,“7 4 1 7” 分别对应console_loglevel、default_message_loglevel、minimum_c onsole_loglevel、default_console_loglevel,具体类型说明如下表(表 32-7)所示:
终端打印类型 | 对应类型说明 |
---|---|
console_loglevel | 只有当printk打印消息的log优先级高于console_loglevel时,才能输出到终端上 |
default_message_loglevel | printk打印消息时默认的log等级 |
minimum_console_loglevel | console_loglevel可以被设置的最小值 |
default_console_loglevel | console_loglevel的缺省值 |
表 32-7
上面的“7 4 1 7”意味着只有优先级高于KERN_DEBUG(7)的打印消息才能输出到终端,在“内核源码/include/linux/kern_levels.h”文件中对于文件打印等级进行了如下打印等级定义:
#define KERN_EMERG KERN_SOH "0" /* system is unusable */
#define KERN_ALERT KERN_SOH "1" /* action must be taken immediately */
#define KERN_CRIT KERN_SOH "2" /* critical conditions */
#define KERN_ERR KERN_SOH "3" /* error conditions */
#define KERN_WARNING KERN_SOH "4" /* warning conditions */
#define KERN_NOTICE KERN_SOH "5" /* normal but significant condition */
#define KERN_INFO KERN_SOH "6" /* informational */
#define KERN_DEBUG KERN_SOH "7" /* debug-level messages */
printk在打印信息前,可以加入相应的打印等级宏定义,具体格式如下所示:
printk(打印等级 “打印信息”)
接下来将使用以下驱动例程进行实际的打印等级测试:
#include <linux/module.h>
#include <linux/kernel.h>
static int __init helloworld_init(void)
{
printk(KERN_EMERG " 0000 KERN_EMERG\n");
printk(KERN_ALERT " 1111 KERN_ALERT\n");
printk(KERN_CRIT " 2222 KERN_CRIT\n");
printk(KERN_ERR " 3333 KERN_ERR\n");
printk(KERN_WARNING " 4444 KERN_WARNING\n");
printk(KERN_NOTICE " 5555 KERN_NOTICE\n");
printk(KERN_INFO " 6666 KERN_INFO\n");
printk(KERN_DEBUG " 7777 KERN_DEBUG\n");
printk(" 8888 no_fix\n");
return 0;
}
static void __exit helloworld_exit(void)
{
printk(KERN_EMERG "helloworld_exit\r\n");
}
module_init(helloworld_init);
module_exit(helloworld_exit);
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("topeet");
加载该驱动之后,第5-11行0-6等级的打印信息就被打印了出来,第13行由于没有设置打印等级,所以会被赋予默认打印等级4,高于console_loglevel打印等级,所以也会被打印出来,最后只有第12行打印等级为7的信息,和console_loglevel打印等级相同,所以不会被打印出来,如下图(图 32-8)所示:
图 32-8
然后使用以下命令将console_loglevel打印等级设置为4,如下图(图 32-9)所示:
echo 4 4 1 7 > /proc/sys/kernel/printk
图 32-9
卸载驱动之后,再一次加载驱动,发现只有打印等级高于4的相关信息被打印了出来,如下图(图32-10)所示:
图32-10
至此关于内核打印等级的实验就结束了。
【最新驱动资料(文档+例程)】
链接 https://pan.baidu.com/s/1M4smUG2vw_hnn0Hye-tkog
提取码:hbh6
【B 站配套视频】
https://b23.tv/XqYa6Hm
【RK3568 购买链接】
https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-2245
baidu.com/s/1M4smUG2vw_hnn0Hye-tkog
提取码:hbh6
【B 站配套视频】
https://b23.tv/XqYa6Hm
【RK3568 购买链接】
https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-2245
2452613.11.2fec74a6elWNeA&id=669939423234