写一个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
// my_driver.c
#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; // 返回 0 表示成功
}

// 模块卸载函数
static void __exit my_driver_exit(void)
{
printk(KERN_INFO "my_driver: 模块卸载\n");
// 清理资源/注销设备
}

// 注册加载/卸载函数
module_init(my_driver_init);
module_exit(my_driver_exit);

// 模块信息(modinfo 可查看)
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
# Makefile
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

✅ 编译 & 加载步骤

  1. 编译驱动
1
make

成功后会生成 my_driver.ko 内核模块文件。

  1. 加载模块
1
sudo insmod my_driver.ko
  1. 查看日志
1
dmesg | tail -n 20
  1. 卸载模块
1
sudo rmmod my_driver
  1. 再次查看日志
1
dmesg | tail -n 20

✅ 输出示例

1
2
3
4
[...]
my_driver: 模块加载
[...]
my_driver: 模块卸载

Linux驱动程序怎么查看打印消息?

在 Linux 驱动开发中,常用 printk() 函数输出调试信息或日志,这些消息默认会被记录到 内核日志缓冲区,可以使用以下方法查看:


✅ 一、使用 dmesg 命令查看内核日志

这是最常见的方法:

1
dmesg

如果你只想查看最近一部分输出,比如最后 20 行:

1
dmesg | tail -n 20

你也可以用关键字过滤你模块相关的输出:

1
dmesg | grep my_driver

✅ 二、查看 /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
dmesg -w

1
journalctl -kf

这两种方式可以实时看到内核输出的日志,特别适合调试驱动。


✅ 五、确保模块输出未被屏蔽

有些发行版默认只显示严重级别的内核日志,可以临时提高手动调试的可见性:

1
2
# 显示所有内核日志
echo "7" | sudo tee /proc/sys/kernel/printk

默认格式是 4 个数字,表示:控制台日志级别、默认日志级别、最低日志级别、默认控制台日志级别。