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中断控制器、设备树支持以及活跃的社区内核源码。

特性树莓派4BBeagleBone Black
SoCBCM2711 (Cortex-A72)AM3358 (Cortex-A8)
GPIO中断控制器ARM GIC-400OMAP GPIO控制器
设备树文件bcm2711-rpi-4-b.dtsam335x-boneblack.dts
默认内核版本6.1.y / 6.6.y5.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 实验环境整体架构

实验环境架构图 实验环境架构图 主机开发环境 (x86_64) 交叉编译工具链 内核源码树 (6.6.y) 模块编译脚本 SCP/rsync 部署 目标板 (树莓派4B) Linux内核 6.6.y 设备树 (bcm2711) GPIO控制器 (GIC-400) LED / 按键硬件 SCP / rsync 串口调试终端 minicom / screen dmesg / insmod / rmmod 硬件外设 LED (GPIO17) + 330Ω 按键 (GPIO27) + 上拉 UART (115200,8N1)

1.5 硬件连接与验证

树莓派4B GPIO引脚定义(使用BCM编号):

功能BCM GPIO物理引脚 (J8)连接
LED输出GPIO17Pin 11→ 330Ω → LED阳极 → LED阴极 → GND
按键输入GPIO27Pin 13→ 按键 → GND (内部上拉启用)
UART TXGPIO14Pin 8→ USB转TTL RX
UART RXGPIO15Pin 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驱动实现”。