printk() 是内核空间的日志输出函数,类似用户空间的 printf(),输出至内核环形缓冲区,可通过 dmesg 或 /var/log/kern.log 查看。本文通过最简 Hello World 模块演示编写、编译、加载、查看日志、卸载全流程。
#include
#include
int init_module(void) {
printk(KERN_INFO "Welcome...\n");
return 0;
}
void cleanup_module(void) {
printk(KERN_INFO "Bye...\n");
}
obj-m := hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:
rm -f *.o *.ko *.mod.c Module.symvers modules.order
make
# 生成 hello.ko
sudo insmod hello.ko
lsmod | grep hello
dmesg | tail
# 应显示:Welcome...
# 查看系统日志
cat /var/log/syslog | grep Welcome
# 或
cat /var/log/kern.log
sudo rmmod hello
dmesg | tail
# 应显示:Bye...
| 宏 | 级别 | 用途 |
|---|---|---|
KERN_EMERG | 0 | 系统不可用 |
KERN_ALERT | 1 | 需立即处理 |
KERN_CRIT | 2 | 严重错误 |
KERN_ERR | 3 | 错误 |
KERN_WARNING | 4 | 警告 |
KERN_NOTICE | 5 | 正常但重要 |
KERN_INFO | 6 | 信息 |
KERN_DEBUG | 7 | 调试 |
默认控制台显示级别由 console_loglevel 控制(通常 7),dmesg -n 可调整。

掌握 printk 与模块编译加载流程,是 Linux 内核开发入门的第一步。进阶可学习 procfs/sysfs 接口、字符/块设备驱动、中断处理与并发控制。