编译第一个LINUX驱动
2025-07-22
48
0
已经有了字符驱动的源代码,并且准备在 PC 的 Ubuntu 22.04 上编译。下面详细说明除了指定 Linux 源代码路径外,还需要做哪些环境配置和注意事项,确保你能顺利编译出内核模块(驱动)。
1. 内核源码的选择与准备
- 推荐使用与你当前运行内核版本一致的内核源码或头文件,否则编译出的模块可能无法被当前内核加载。
- 无需下载完整内核源码,只要有对应内核的“内核头文件(kernel headers)”即可。
查看当前内核版本
uname -r
例如输出:5.15.0-60-generic
2. 安装内核头文件和编译工具
在 Ubuntu 上,直接安装内核头文件和构建工具即可:
sudo apt update
sudo apt install build-essential linux-headers-$(uname -r)
build-essential包含 gcc、make 等编译工具。linux-headers-$(uname -r)安装与你当前内核版本匹配的头文件。
3. Makefile 的基本写法
假设你的驱动源文件叫 mychardev.c,Makefile 可以这样写:
obj-m += mychardev.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
/lib/modules/$(uname -r)/build是当前内核的头文件和Makefile所在目录,Ubuntu自动维护。obj-m表示要编译成模块的对象文件。
4. 编译驱动模块
在驱动源代码目录下执行:
make
编译成功后会生成 mychardev.ko 文件,这就是你的内核模块。
编译输出:
[root@mypcie mytest]# ll
total 436
-rw-r--r-- 1 root root 160 Jul 22 20:40 Makefile
-rw-r--r-- 1 root root 28 Jul 22 20:47 modules.order
-rw-r--r-- 1 root root 0 Jul 22 20:47 Module.symvers
-rw-r--r-- 1 root root 280 Jul 22 20:47 mychardev.c
-rw-r--r-- 1 root root 210744 Jul 22 20:47 mychardev.ko
-rw-r--r-- 1 root root 826 Jul 22 20:47 mychardev.mod.c
-rw-r--r-- 1 root root 108984 Jul 22 20:47 mychardev.mod.o
-rw-r--r-- 1 root root 103200 Jul 22 20:47 mychardev.o
5. 加载和测试模块
- 加载模块:
sudo insmod mychardev.ko - 查看模块是否加载:
lsmod | grep mychardev - 查看内核日志(调试信息):
dmesg | tail -n 20 - 卸载模块:
sudo rmmod mychardev
6. 常见问题与注意事项
- 内核版本要匹配:编译用的头文件必须和运行内核一致,否则模块可能无法加载。
- 不建议直接用官网主线源码,除非你自己编译并运行了该内核。一般用
/lib/modules/$(uname -r)/build下的头文件。 - 如果要为其他内核版本编译,需要安装对应版本的 headers,并指定
-C路径。 - 开发环境建议:用虚拟机或容器环境,便于测试和还原。
7. 总结流程
- 安装内核头文件和编译工具
- 编写 Makefile,指定头文件路径
- make 编译
- insmod 加载测试
Linux驱动测试示例





