写一个linux驱动程序模板
以下是一个Linux 内核模块(驱动)模板,适用于内核模块开发入门者,可用于字符设备、平台设备、网络驱动等的基础架构。
这个模板适用于 大多数类型的内核模块,并包括模块加载、卸载、打印日志等基础结构。
✅ Linux 驱动程序模板(C语言)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h>
#define DRIVER_AUTHOR "YourName" #define DRIVER_DESC "A simple Linux driver template"
static int __init my_driver_init(void) { printk(KERN_INFO "my_driver: 模块加载\n"); return 0; }
static void __exit my_driver_exit(void) { printk(KERN_INFO "my_driver: 模块卸载\n"); }
module_init(my_driver_init); module_exit(my_driver_exit);
MODULE_LICENSE("GPL"); MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_DESCRIPTION(DRIVER_DESC); MODULE_VERSION("1.0");
|
✅ 编译配置(Makefile)
1 2 3 4 5 6 7 8 9 10 11
| obj-m += my_driver.o
KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd)
all: $(MAKE) -C $(KDIR) M=$(PWD) modules
clean: $(MAKE) -C $(KDIR) M=$(PWD) clean
|
✅ 编译 & 加载步骤
- 编译驱动
成功后会生成 my_driver.ko 内核模块文件。
- 加载模块
1
| sudo insmod my_driver.ko
|
- 查看日志
- 卸载模块
- 再次查看日志
✅ 输出示例
1 2 3 4
| [...] my_driver: 模块加载 [...] my_driver: 模块卸载
|
Linux驱动程序怎么查看打印消息?
在 Linux 驱动开发中,常用 printk() 函数输出调试信息或日志,这些消息默认会被记录到 内核日志缓冲区,可以使用以下方法查看:
✅ 一、使用 dmesg 命令查看内核日志
这是最常见的方法:
如果你只想查看最近一部分输出,比如最后 20 行:
你也可以用关键字过滤你模块相关的输出:
✅ 二、查看 /var/log/kern.log 或 /var/log/messages
这些是系统维护的日志文件,具体路径取决于发行版和系统配置:
1 2 3
| sudo less /var/log/kern.log
sudo less /var/log/messages
|
你可以在里面查找模块名或关键词,比如:
1
| grep my_driver /var/log/kern.log
|
⚠️ 有些系统(比如 Ubuntu)默认不记录到 kern.log,建议先查 dmesg。
✅ 三、在 printk() 中加 KERN_ 前缀控制日志级别
printk() 支持不同日志级别,例如:
1 2 3
| printk(KERN_INFO "驱动加载成功\n"); printk(KERN_ERR "发生错误!\n"); printk(KERN_WARNING "警告信息\n");
|
常用日志等级:
| 宏定义 |
等级含义 |
KERN_EMERG |
紧急 |
KERN_ALERT |
报警 |
KERN_CRIT |
严重 |
KERN_ERR |
错误 |
KERN_WARNING |
警告 |
KERN_NOTICE |
注意 |
KERN_INFO |
普通信息 |
KERN_DEBUG |
调试信息 |
✅ 四、持续监控内核日志
或
这两种方式可以实时看到内核输出的日志,特别适合调试驱动。
✅ 五、确保模块输出未被屏蔽
有些发行版默认只显示严重级别的内核日志,可以临时提高手动调试的可见性:
1 2
| echo "7" | sudo tee /proc/sys/kernel/printk
|
默认格式是 4 个数字,表示:控制台日志级别、默认日志级别、最低日志级别、默认控制台日志级别。