1. 课程导论与实验环境搭建
本课程面向具备C语言基础与Linux基本操作能力的嵌入式开发者,通过LED驱动与GPIO中断响应两个核心案例,系统讲解Linux内核模块开发、字符设备驱动框架、设备树、中断子系统以及用户态调试方法。课程采用理论讲解 + 动手实验 + 调试分析的三段式教学,最终使学员能够独立完成简单外设的内核驱动开发与调试。
1.1 课程目标与学习路径
| 模块 | 核心知识点 | 实战产出 |
|---|---|---|
| 基础篇 | 内核模块结构、Makefile、printk调试 | 第一个内核模块“Hello LED” |
| 驱动篇 | 字符设备驱动、file_operations、设备树匹配 | 完整LED驱动(用户态控制亮灭) |
| 中断篇 | GPIO中断注册、中断顶半部/底半部、tasklet/workqueue | 按键中断响应驱动(打印/反转LED) |
| 调试篇 | 动态调试、ftrace、perf、crash分析 | 中断延迟测量与驱动性能优化 |
学习路径建议: 按“基础 → 驱动 → 中断 → 调试”顺序推进,每节实验必须独立完成代码编写与板级验证,不要跳过硬件搭建步骤。
1.2 硬件平台选型
本课程以树莓派4B (BCM2711) 为主推平台,同时兼容BeagleBone Black (AM3358)。两平台均具备完整GPIO中断控制器、设备树支持以及活跃的社区内核源码。
| 特性 | 树莓派4B | BeagleBone Black |
|---|---|---|
| SoC | BCM2711 (Cortex-A72) | AM3358 (Cortex-A8) |
| GPIO中断控制器 | ARM GIC-400 | OMAP GPIO控制器 |
| 设备树文件 | bcm2711-rpi-4-b.dts | am335x-boneblack.dts |
| 默认内核版本 | 6.1.y / 6.6.y | 5.10.y / 6.1.y |
| 调试接口 | UART (GPIO14/15) + JTAG (可选) | USB串口 + JTAG |
硬件准备清单: 树莓派4B主板 + 32GB microSD卡 + 5V/3A电源 + USB转TTL串口模块 + 杜邦线若干 + LED(5mm) + 330Ω电阻 + 按键开关。BeagleBone Black用户需额外准备USB转串口线。
1.3 软件环境搭建
1.3.1 交叉编译工具链
在x86_64主机上为ARM64目标编译内核模块,推荐使用gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu。安装步骤:
# 下载并解压
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
tar -xf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz -C ~/tools/
# 添加至PATH
echo 'export PATH=$PATH:~/tools/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin' >> ~/.bashrc
source ~/.bashrc
# 验证
aarch64-none-linux-gnu-gcc --version
1.3.2 内核源码树构建
从树莓派官方仓库获取内核源码,配置并编译内核模块依赖:
# 克隆内核源码(以6.6.y为例)
git clone --depth=1 -b rpi-6.6.y https://github.com/raspberrypi/linux.git ~/linux-rpi
# 生成默认配置
cd ~/linux-rpi
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- bcm2711_defconfig
# 编译内核模块依赖(无需完整编译内核)
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- modules_prepare
节省时间技巧: 使用
make -j$(nproc) modules_prepare 仅生成 Module.symvers 和头文件依赖,避免完整编译内核(约需30分钟)。首次实验前务必执行此步骤。
1.4 实验环境整体架构
1.5 硬件连接与验证
树莓派4B GPIO引脚定义(使用BCM编号):
| 功能 | BCM GPIO | 物理引脚 (J8) | 连接 |
|---|---|---|---|
| LED输出 | GPIO17 | Pin 11 | → 330Ω → LED阳极 → LED阴极 → GND |
| 按键输入 | GPIO27 | Pin 13 | → 按键 → GND (内部上拉启用) |
| UART TX | GPIO14 | Pin 8 | → USB转TTL RX |
| UART RX | GPIO15 | Pin 10 | → USB转TTL TX |
| GND | - | Pin 6/9/14 | → USB转TTL GND |
验证步骤: 上电后通过串口登录树莓派,执行
gpioinfo 查看GPIO状态,使用 gpioset gpiochip0 17=1 点亮LED,使用 gpioget gpiochip0 27 读取按键电平。确认硬件通路正常后再进入内核模块开发。
1.6 第一个内核模块实验框架
课程首个实验将编写一个简单的内核模块,控制GPIO17输出高低电平。模块框架如下:
// led_module.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/gpio.h>
#define LED_GPIO 17
static int __init led_init(void)
{
int ret;
ret = gpio_request(LED_GPIO, "led_gpio");
if (ret) {
pr_err("Failed to request GPIO %d\n", LED_GPIO);
return ret;
}
gpio_direction_output(LED_GPIO, 0);
gpio_set_value(LED_GPIO, 1); // 点亮LED
pr_info("LED module loaded, GPIO17 set HIGH\n");
return 0;
}
static void __exit led_exit(void)
{
gpio_set_value(LED_GPIO, 0); // 熄灭LED
gpio_free(LED_GPIO);
pr_info("LED module unloaded, GPIO17 freed\n");
}
module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Kernel Driver Course");
MODULE_DESCRIPTION("Simple LED GPIO control module");
配套Makefile:
obj-m += led_module.o
KERNEL_DIR ?= ~/linux-rpi
CROSS_COMPILE ?= aarch64-none-linux-gnu-
ARCH ?= arm64
all:
make -C $(KERNEL_DIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules
clean:
make -C $(KERNEL_DIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) clean
编译与部署: 在主机执行
make 生成 led_module.ko,通过 scp led_module.ko pi@<树莓派IP>:~/ 传输至目标板,然后 insmod led_module.ko 加载模块,观察LED是否点亮,使用 dmesg | tail 查看内核日志。
1.7 调试工具链准备
课程调试环节将使用以下工具组合:
| 工具 | 用途 | 安装命令 (树莓派) |
|---|---|---|
| dynamic_debug | 动态控制pr_debug输出 | 内核配置已默认开启 |
| ftrace | 函数调用跟踪与延迟分析 | mount -t tracefs tracefs /sys/kernel/tracing |
| perf | 性能计数器采样 | sudo apt install linux-perf |
| crash | 内核崩溃转储分析 | sudo apt install crash |
| devmem2 | 物理内存寄存器查看 | sudo apt install devmem2 |
注意事项: 调试工具需在目标板本地安装,主机仅负责交叉编译。ftrace和perf需要内核开启相应配置(CONFIG_FTRACE、CONFIG_PERF_EVENTS),树莓派官方内核默认已启用。
1.8 本章小结
本章完成了课程导论与实验环境搭建,核心要点:
- 课程以LED驱动和GPIO中断响应为主线,覆盖内核模块开发全流程。
- 硬件平台选择树莓派4B,具备完整GIC中断控制器与设备树支持。
- 软件环境包括交叉编译工具链(gcc-arm-10.3)和内核源码树(rpi-6.6.y)。
- 硬件连接采用GPIO17驱动LED、GPIO27读取按键,串口作为调试通道。
- 第一个内核模块框架已搭建,后续章节将逐步完善字符设备驱动与中断处理。
确保上述环境全部验证通过后,再进入第2章“字符设备驱动框架与LED驱动实现”。