2. Linux 内核源码获取与版本管理
内核源码是编译优化的起点。选择错误的版本或分支,可能导致实时补丁不兼容、驱动缺失或长期维护成本激增。本节从 Git 仓库克隆、版本选型到目录结构解析,建立源码管理的标准操作流程。
2.1 Git 仓库克隆与分支策略
Linux 内核官方源码托管于 git.kernel.org,全球维护者通过 Git 协同。克隆时需指定深度(depth)以节省带宽,并理解上游分支命名规则。
2.1.1 克隆命令与参数
# 完整克隆(含全部历史,约 3.5 GB)
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
# 浅克隆(仅最新提交,约 200 MB,适合快速构建)
git clone --depth 1 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
# 指定分支克隆(如长期支持版)
git clone --depth 1 --branch linux-6.1.y \
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
实时系统建议: 使用
--depth 1 浅克隆后,通过 git remote set-branches 添加远程跟踪分支,再 git fetch --unshallow 按需拉取完整历史,兼顾首次速度与后续调试需求。
2.1.2 分支命名规范
| 分支模式 | 示例 | 用途 |
|---|---|---|
master / main |
master |
Linus Torvalds 主线,每日合并,不稳定 |
linux-6.x.y |
linux-6.1.y |
稳定版分支,只合入安全与关键修复 |
linux-6.x.y-rt |
linux-6.1.y-rt |
实时抢占(PREEMPT_RT)补丁分支 |
v6.x |
v6.1 |
发布标签,用于构建可复现的基线 |
2.2 稳定版与长期支持版选择
实时系统通常要求 3–5 年的维护周期,因此 LTS(Long Term Support)是首选。非 LTS 稳定版仅维护数月,不适合产品化。
2.2.1 版本生命周期对比
| 版本类型 | 维护周期 | 实时补丁支持 | 适用场景 |
|---|---|---|---|
| 主线(Mainline) | 数天~数周 | 无 | 开发测试、新功能验证 |
| 稳定版(Stable) | 3~6 个月 | 部分有 | 短期项目、快速原型 |
| 长期支持版(LTS) | 4~6 年 | 官方提供 | 工业控制、航空航天、医疗设备 |
版本陷阱: 不要直接使用
master 分支编译实时内核。主线代码每天变动,PREEMPT_RT 补丁通常滞后 2–4 周。始终从 linux-6.x.y-rt 或 LTS + RT 补丁组合开始。
2.2.2 实时补丁获取路径
- 官方 RT 分支:
git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git - LTS + RT 补丁: 从 https://cdn.kernel.org/pub/linux/kernel/projects/rt/ 下载对应 LTS 版本的 .patch.xz
- 发行版维护: Ubuntu / Debian 的
linux-image-*-rt包,适合快速评估
2.3 源码目录结构解析
理解目录布局是配置内核的第一步。实时调优主要涉及 kernel/、sched/、drivers/ 和 arch/ 四个区域。
2.3.1 顶层目录功能总览
| 目录 | 核心内容 | 实时调优关注点 |
|---|---|---|
arch/ |
CPU 架构相关代码(x86, ARM, RISC-V) | 中断控制器、时钟源、页表锁 |
kernel/ |
核心调度、进程管理、irq、time | PREEMPT_RT 补丁、中断线程化 |
sched/ |
CFS、RT 调度器、deadline 调度 | 调度延迟、任务抢占模型 |
drivers/ |
所有设备驱动 | 中断共享、DMA 缓存一致性 |
mm/ |
内存管理(页分配、slab、vmalloc) | 实时页分配器、内存锁 |
fs/ |
文件系统实现 | O_DIRECT、页缓存锁 |
include/ |
全局头文件与 API 定义 | spinlock、mutex 实时变体 |
Documentation/ |
内核文档与配置说明 | 实时相关文档位于 Documentation/RT/ |
2.3.2 实时调优关键路径
- 中断线程化:
kernel/irq/manage.c— 将硬中断转为可抢占的内核线程 - 调度器:
kernel/sched/rt.c— RT 调度类,设置sched_rt_runtime_us - 自旋锁:
include/linux/spinlock_rt.h— PREEMPT_RT 下 spinlock 变为可睡眠锁 - 高精度定时器:
kernel/time/hrtimer.c— 微秒级定时精度
实战技巧: 使用
find . -name "Kconfig" | xargs grep -l "PREEMPT_RT" 快速定位所有与实时抢占相关的配置选项。
2.4 源码目录结构 SVG 架构图
2.5 版本管理最佳实践清单
- 锁定基线: 确定 LTS 版本后,使用
git tag -v v6.1.xx验证 GPG 签名,确保源码未被篡改。 - 创建本地分支:
git checkout -b my-rt-6.1 linux-6.1.y,避免直接修改上游分支。 - 补丁管理: 将 PREEMPT_RT 补丁、厂商 BSP 补丁、自研优化补丁分别放入
patches/目录,使用quilt或git am有序应用。 - 配置分离: 内核
.config不提交到源码树,使用defconfig+ 增量片段(config-fragment-rt.cfg)管理。 - 持续集成: 每次补丁变更后运行
make kernelrelease确认版本号,避免部署时混淆。
效率工具: 使用
git worktree add 在同一仓库下创建多个工作目录,同时维护 LTS 主线、RT 分支、BSP 分支,无需反复克隆。