https://blog.csdn.net/Wang20122013/article/details/116064435
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) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)