RK3568驱动指南|第四篇 高级字符设备进阶-第32章 Linux内核打印实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。


【公众号】迅为电子

【粉丝群】824412014(加群获取文档+例程)

【视频观看】嵌入式学习之Linux驱动(第四篇 高级字符设备进阶_全新升级)_基于RK3568

【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板


第32章 Linux内核打印实验

本手册的实验都是在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)所示:

img

然后使用以下组合命令查找nfs相关的打印信息,如下图(图 32-2)所示:

dmesg | grep nfs

img

至此关于dmesg命令就讲解演示完成了。

32.2 方法二:查看kmsg文件

内核所有的打印信息都会输出到循环缓冲区 ‘log_buf’,为了能够方便的在用户空间读取 内核打印信息,Linux内核驱动将该循环缓冲区映射到了/proc目录下的文件节点kmsg。通过 cat或者其他应用程序读取Log Buffer的时候可以不断的等待新的log,所以访问/proc/kmsg 的方式适合长时间的读取log,一旦有新的log就可以被打印出来。

首先使用以下命令读取kmsg文件,在没有新的内核打印信息时会阻塞,如下图(图 32-3)所示:

cat /proc/kmsg

img

然后在该设备的其他终端加载任意有打印信息的驱动文件(这里使用的是ssh),如下图(图 32-4)所示:

img

在串口终端中可以看到对应驱动的打印信息就被打印了出来,如下图(图 32-5)所示:

img

32.3 方法三:调整内核打印等级

内核的日志打印由相应的打印等级来控制,可以通过调整内核打印等级来控制打印日志的输出。使用以下命令查看当前默认打印等级,如下图(图 32-6)所示:

cat /proc/sys/kernel/printk

img

可以看到内核打印等级由四个数字所决定,“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_loglevelprintk打印消息时默认的log等级
minimum_console_loglevelconsole_loglevel可以被设置的最小值
default_console_loglevelconsole_loglevel的缺省值

上面的“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)所示:

img

然后使用以下命令将console_loglevel打印等级设置为4,如下图(图 32-9)所示:

echo 4 4 1 7 > /proc/sys/kernel/printk

img

卸载驱动之后,再一次加载驱动,发现只有打印等级高于4的相关信息被打印了出来,如下图(图32-10)所示:

img

至此关于内核打印等级的实验就结束了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值