深入理解内核日志记录与 printk API
1. 引言
在完成简单的 “Hello, world” 内核模块编写与测试后,我们将深入探讨内核日志记录以及功能强大的 printk API 的更多关键细节。对于内核或驱动开发者而言,清晰理解这些内容至关重要。
2. 使用内核内存环形缓冲区
内核日志缓冲区是内核虚拟地址空间中的一块内存缓冲区,用于保存 printk 的输出结果。从技术层面来讲,它是全局的 __log_buf[] 变量,其在 kernel/printk/printk.c 中的定义如下:
#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
#define LOG_BUF_LEN_MAX (u32)(1 << 31)
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 字节)。当缓冲区满时,会从第 0 字节开始覆盖原有内容,因此被称为 “环形” 或 “循环” 缓冲区。其大小由 Kconfig 变量 CONFIG_LOG_BUF_SHIFT 决定(在 C 语言中, 1 << n 表示
超级会员免费看
订阅专栏 解锁全文
53

被折叠的 条评论
为什么被折叠?



