我知道 dmesg 命令会打印存储在环形缓冲区中的消息。但是从 Linux 源代码来看,缓冲区的名称是什么?我想在 Linux 被终止且没有任何消息后查看缓冲区。我怀疑这不是由软件陷阱引起的(因此没有恐慌消息),但我可以检查内存(使用一些 System.map 和虚拟到物理地址的转换)。
我知道 dmesg 命令会打印存储在环形缓冲区中的消息。但是从 Linux 源代码来看,缓冲区的名称是什么?我想在 Linux 被终止且没有任何消息后查看缓冲区。我怀疑这不是由软件陷阱引起的(因此没有恐慌消息),但我可以检查内存(使用一些 System.map 和虚拟到物理地址的转换)。
kernel/printk/printk.c(来自 v4.18 内核,因为这是您输入此答案的 PC 上的内核)具有以下内容,定义了记录缓冲区:
从来看
printk.c
:__log_buf
是一个数组,其大小在内核配置期间设置,以确保在早期启动期间有一个日志缓冲区。其大小__log_buf
从配置参数中设置CONFIG_LOG_BUF_SHIFT
。setup_log_buf被称为 boot,并且会在以下情况下为新的日志缓冲区分配空间:
CONFIG_LOG_CPU_MAX_BUF_SHIFT
配置参数)。log_buf_len
在内核命令行上用于指定大于的环形缓冲区大小__LOG_BUF_LEN
。当分配新的日志缓冲区时:
__log_buf
被复制到新分配的缓冲区。log_buf
更改为指向新的环形缓冲区。log_buf_len
更改为新的环形缓冲区的大小。环形缓冲区通过
log_buf
指针和log_buf_len
长度来访问。查看v4.18 内核可以看到和变量
/boot/System.map-`uname -r
的地址。log_buf
log_buf_len
这个答案应该有望展示如何开始检查包含环形缓冲区的内存。请参阅
printk.c
环形缓冲区的内部格式,它使用struct printk_log
。我还没有检查环形缓冲区的内部格式在内核版本之间何时发生变化。