Linux设备驱动开发与内核构建调试 - 第1节

1.1 Linux 内核版本命名规则

Linux 内核的版本号由 Linus Torvalds 及其维护团队统一管理,采用 主版本号.次版本号.补丁级别 的三段式结构。自 2.6 内核之后,版本号不再通过奇偶次版本区分稳定/开发,而是采用基于时间的语义化命名。

1.1.1 版本号格式

当前内核版本号遵循 A.B.C 格式,其中:

  • A — 主版本号(Major):仅在架构或 API 发生重大不兼容变更时递增,例如 5.x → 6.x。
  • B — 次版本号(Minor):每 2~3 个月发布一次,包含新特性、驱动更新和功能改进。
  • C — 补丁级别(Patch):修复安全漏洞、关键 Bug,不引入新功能,通常每 1~2 周发布一次。
示例: 内核版本 6.1.25 表示主版本 6、次版本 1、第 25 个补丁。该版本属于 6.1 LTS 系列的一个稳定补丁。

1.1.2 版本号演进历史

时期 版本格式 说明
1.0 ~ 2.6.39 A.B.C 偶数为稳定版,奇数为开发版(如 2.5.x 开发 → 2.6.x 稳定)
3.0 ~ 3.19 A.B.C 取消奇偶区分,次版本快速递增
4.0 ~ 至今 A.B.C 完全基于时间驱动,次版本每 2~3 个月递增

1.2 主线 / 稳定 / LTS 版本区别

Linux 内核社区同时维护多个分支,设备驱动开发者需要根据项目需求选择合适的内核基线。下表列出三种主要分支的核心差异:

分支类型 维护周期 特性更新 适用场景
主线(Mainline) 约 2 个月 最新特性、新驱动、API 变更 开发测试、新硬件早期支持
稳定(Stable) 约 1~2 个月 仅 Bug 修复和安全补丁 一般产品、短期项目
LTS(Long Term Support) 4~6 年 关键 Bug 修复、安全更新 嵌入式产品、工业设备、长期维护
驱动开发建议: 商业嵌入式产品优先选择 LTS 版本(如 5.10 LTS、6.1 LTS),可获得长期安全更新和稳定的驱动 API。主线版本适合原型验证和驱动移植评估。

1.2.1 分支关系示意图

下图展示主线、稳定、LTS 三个分支的演进与合并关系:

Linux 内核分支关系图 主线 / 稳定 / LTS 分支关系 主线 (Mainline) 稳定 (Stable) LTS (Long Term Support) v6.1-rc1 v6.1 v6.2-rc1 v6.2 v6.1.1 v6.1.2 v6.1 LTS 主线发布后,稳定分支 从主线切出并持续修复; LTS 从稳定分支中选定 并长期维护。

1.3 内核源码目录结构解析

Linux 内核源码采用模块化、层次化的目录组织方式。理解目录结构是驱动开发的基础,能够帮助开发者快速定位所需代码。以下为顶层目录结构及核心子目录说明:

1.3.1 顶层目录总览

目录/文件 功能描述 驱动开发者关注度
arch/ 体系结构相关代码(x86、ARM、RISC-V 等) ⭐⭐⭐⭐⭐
drivers/ 设备驱动代码(字符、块、网络、I2C、SPI 等) ⭐⭐⭐⭐⭐
include/ 内核头文件(API 声明、数据结构、宏定义) ⭐⭐⭐⭐⭐
kernel/ 核心内核代码(调度、进程管理、信号、模块) ⭐⭐⭐⭐
mm/ 内存管理子系统 ⭐⭐⭐
fs/ 文件系统实现(ext4、btrfs、proc、sysfs 等) ⭐⭐⭐
net/ 网络协议栈(TCP/IP、socket、netfilter) ⭐⭐⭐
Documentation/ 内核文档、API 说明、配置指南 ⭐⭐⭐⭐
scripts/ 编译、配置、分析工具脚本 ⭐⭐
tools/ 用户空间工具(perf、selftests、objtool) ⭐⭐

1.3.2 驱动开发核心目录详解

对于设备驱动开发者,以下目录需要重点掌握:

  • drivers/ — 驱动代码主目录,按设备类型划分子目录:
    • drivers/char/ — 字符设备驱动
    • drivers/block/ — 块设备驱动
    • drivers/net/ — 网络设备驱动
    • drivers/i2c/ — I2C 总线及设备驱动
    • drivers/spi/ — SPI 总线及设备驱动
    • drivers/gpio/ — GPIO 控制器驱动
    • drivers/platform/ — 平台设备驱动(常用于嵌入式 SoC)
  • include/linux/ — 驱动开发最常引用的头文件目录:
    • include/linux/module.h — 模块加载/卸载宏
    • include/linux/fs.h — 文件操作结构体 file_operations
    • include/linux/cdev.h — 字符设备注册接口
    • include/linux/platform_device.h — 平台设备驱动框架
  • arch/arm/ / arch/arm64/ / arch/riscv/ — 嵌入式平台体系结构代码,包含:
    • arch/arm/boot/dts/ — 设备树源文件(.dts / .dtsi)
    • arch/arm/mach-*/ — 特定 SoC 平台初始化代码

1.3.3 内核源码目录结构示意图

Linux 内核源码目录结构 Linux 内核源码顶层目录结构 linux-6.1/ arch/ drivers/ include/ kernel/ mm/ char/ block/ net/ i2c/ spi/ gpio/ linux/ (核心 API) uapi/ (用户空间 API) asm-generic/ arm/ arm64/ riscv/ x86/ 驱动开发者重点关注: • drivers/ — 驱动代码实现 • include/linux/ — 驱动 API 头文件 • arch/*/boot/dts/ — 设备树文件 Documentation/ 目录包含驱动开发 指南、API 文档和内核配置说明

1.3.4 驱动开发常用路径速查

快速定位指南:

  • 编写字符设备驱动 → drivers/char/ + include/linux/fs.h
  • 编写 I2C 设备驱动 → drivers/i2c/ + include/linux/i2c.h
  • 编写 SPI 设备驱动 → drivers/spi/ + include/linux/spi/spi.h
  • 编写平台设备驱动 → drivers/platform/ + include/linux/platform_device.h
  • 查看设备树绑定 → Documentation/devicetree/bindings/
  • 查看内核配置选项 → arch/arm/configs/ 或 arch/arm64/configs/

1.4 本章小结