1 前言
在调试Linux内核的时候经常会用到dmesg命令,常用的用法有:
1. 显示ring buffer内容
dmseg
2. 把ring buffer内容输出到文件
dmesg >log.txt
3. 清除当前ring buffer的内容
dmesg -C
方法3经常用作要调试驱动的时候用,先把以前的ring buffer的内容清空,然后用insmod xxx.ko加载自己的驱动,然后后面打印的就是自己
的驱动的内容。
2 调整ring buffer大小
当调试信息过多的话ring buffer会满导致无法显示以前的信息,如何把ring buffer变大
原理
Linux内核中打印内核消息时用到了一个环形缓冲区。
这个缓冲区的大小由 CONFIG_LOG_BUF_SHIFT 控制,规律为:
size=2CONFIG_LOG_BUF_SHIFT
因此,需要修改 Linux 内核源码中的一个控制 log buffer size 的宏:CONFIG_LOG_BUF_SHIFT。
方法1 编译选项中更改
make menuconfig
General setup
(18)Kernel log buffer size (16 => 64KB,17 => 128KB)
init/Kconfig
config LOG_BUF_SHIFT
int "Kernel log buffer size (16 => 64KB, 17 => 128KB)"
range 12 21
default 17
help
Select kernel log buffer size as a power of 2.
Examples:
17 => 128 KB
16 => 64 KB
15 => 32 KB
14 => 16 KB
13 => 8 KB
12 => 4 KB
可以看到 shift 最大值限制到了 21,也就是:2 M
方法2:源码中修改
路径:kernel/printk.c
#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
static char __log_buf[__LOG_BUF_LEN];
可以看到,是已经在编译时定死的一块静态空间,不能动态调整了。
只需要修改__LOG_BUF_LEN即可。
最大不超过31或者63(CPU位数-1)