Linux驱动测试示例
+ -

编译第一个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. 总结流程

  1. 安装内核头文件和编译工具
  2. 编写 Makefile,指定头文件路径
  3. make 编译
  4. insmod 加载测试

0 篇笔记 写笔记

关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!