如何让内核“日记”一条不丢?
当我们想要查看内核相关信息的时候,经常会用到dmesg命令,但是我们知道dmesg是从环形缓冲区内得到这些消息的,而这个缓冲区通常只有128KB的大小;假如内核打印的消息过多,就难免会“丢掉”前面的消息,那么如何保证让内核信息一条也不丢失呢?
系统日志架构
主要步骤:
改动DTS文件时需要慎重一些,改动前记得存一个备份文件。
以kenel/include/net/bluetooth/bluetooth.h为例。
- 找到bluetooth.h文件,关于调试打印信息的宏定义是通过下面的话去定义的。
#define BT(fmt, ...) pr_debug(fmt "\n", ##__VA_ARGS__)
- 但是pr_debug是否把信息打印出来,是需要去手动去开启的;假如我们想要在系统启动阶段,就获取相应的信息,那么就需要用到printk;也就是要把宏定义改成下面的样子。
#define BT(fmt, ...) printk(fmt "\n", ##__VA_ARGS__)
- 完成修改后保存,再去编译内核,然后把boot.img换到GDK8内就行(可参考https://www.nanocode.cn/wiki/docs/gdk8_primer/primer_gdk8_img )。
- 但当重新开机以后,去查看dmesg信息,会发现dmesg信息只打印出来了一部分,[11.999043]之前的消息全都消失不见了;如下图所示。
当然内核肯定是打印了这些消息的,不过没有显示罢了!这显然是因为缓冲区的空间大小有点小,信息又太多,于是前面的信息就被覆盖掉了;但是这样可不行啊!dmesg信息就相当于内核的“日记”,如果内核“日记”丢了几页,那么我们就不能轻松的知道当时内核发生过什么事情了,排除问题的难度也会加大;因此我们必须要让内核“日记”一页也不丢! - 想要让缓冲区空间变大就要去修改DTS文件;于是立马打开DTS文件,找到chosen{…};如下所示。
chosen { bootargs = "storagemedia=emmc androidboot.mode=normal androidboot.verifiedbootstate=orange androidboot.slot_suffix= androidboot.serialno=EA4R1B8R7J rw rootwait earlycon=uart8250,mmio32,0xff130000 swiotlb=1 kpti=0 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rootfstype=ext4 coherent_pool=1m"; };
- 在chosen{……}内添加
log_buf_len=2M
;设置一下缓冲区的大小,如下所示(具体大小也可以自己去设置,别几百Mb的去设置就好)。chosen { bootargs = "storagemedia=emmc androidboot.mode=normal androidboot.verifiedbootstate=orange androidboot.slot_suffix= androidboot.serialno=EA4R1B8R7J rw rootwait earlycon=uart8250,mmio32,0xff130000 swiotlb=1 kpti=0 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rootfstype=ext4 coherent_pool=1m log_buf_len=2M"; };
- 此时在完成刷机后,再次开机查看dmesg信息;就可以看到完整的“日记”了;同时可以在log_buf_len那一行看到,经过设置的缓冲区大小。
作者:admin 创建时间:2021-12-08 10:42
最后编辑:admin 更新时间:2024-09-14 11:25
最后编辑:admin 更新时间:2024-09-14 11:25