点击打开链接
我们可以用printk打印kernel的日志信息(即log信息),根据时间戳可以判断内核新打印的log会覆盖掉以前打印的log。原因是内核用环形缓冲区存放打印的log信息。那么
如何增大缓冲区的大小呢?
我们看kernel/printk.c的代码
- <span style="font-family: Arial, Helvetica, sans-serif;"></span>
- #define LOG_ALIGN __alignof__(struct printk_log)
- #define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
- static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN);
- static char *log_buf = __log_buf;
- static u32 log_buf_len = __LOG_BUF_LEN;
正是__LOG_BUF_LEN这个宏设置了环形缓冲区的大小,那么__LOG_BUF_LEN的大小是多少呢?是由1 << CONFIG_LOG_BUF_SHIFT(即2的CONFIG_LOG_BUF_SHIFT次幂)来决定的,那么CONFIG_LOG_BUF_SHIFT这个配置项又是在哪里定义呢?
在init/Kconfig里定义
- config LOG_BUF_SHIFT
- int "Kernel log buffer size (16 => 64KB, 17 => 128KB)"
- range 12 21
- default 17
- depends on PRINTK
- help
- Select the minimal kernel log buffer size as a power of 2.
- The final size is affected by LOG_CPU_MAX_BUF_SHIFT config
- parameter, see below. Any higher size also might be forced
- by "log_buf_len" boot parameter.
-
- Examples:
- 17 => 128 KB
- 16 => 64 KB
- 15 => 32 KB
- 14 => 16 KB
- 13 => 8 KB
- 12 => 4 KB
可见CONFIG_LOG_BUF_SHIFT是一个内核配置项。它的大小可以配置为12~21,也就是说环形缓冲区的大小可以配置为4 KB - 2MB。内核(3.18内核)默认是17,即缓冲区的大小为2^17(131072)B。
所以要想增大或者减小环形缓冲区的大小,只需要在内核的配置文件里(对于arm架构为arch/arm/configs/xxx或者arch/arm64/configs/xxx)添加CONFIG_LOG_BUF_SHIFT=XX 即可修改环形缓冲区的大小。