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 实时补丁获取路径

  1. 官方 RT 分支: git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git
  2. LTS + RT 补丁: 从 https://cdn.kernel.org/pub/linux/kernel/projects/rt/ 下载对应 LTS 版本的 .patch.xz
  3. 发行版维护: 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 架构图

Linux 内核源码目录架构与实时调优关联 Linux 内核源码目录架构(实时调优视角) arch/ kernel/ sched/ drivers/ mm/ include/ 中断控制器 irq/manage.c rt.c 中断共享 实时页分配 spinlock_rt 实时调优核心区域 • kernel/irq/ — 中断线程化、中断亲和性设置 • kernel/sched/ — RT 调度类、deadline 调度、抢占模型切换 • include/linux/ — spinlock_rt.h、mutex_rt.h 实时锁原语 版本选择建议 1. 工业级产品:选择 LTS 6.1/6.6 + PREEMPT_RT 补丁 2. 开发评估:使用 linux-6.x.y-rt 分支,减少补丁冲突 3. 避免:主线 master + 手动 backport RT 补丁(维护成本极高)

2.5 版本管理最佳实践清单

  1. 锁定基线: 确定 LTS 版本后,使用 git tag -v v6.1.xx 验证 GPG 签名,确保源码未被篡改。
  2. 创建本地分支: git checkout -b my-rt-6.1 linux-6.1.y,避免直接修改上游分支。
  3. 补丁管理: 将 PREEMPT_RT 补丁、厂商 BSP 补丁、自研优化补丁分别放入 patches/ 目录,使用 quilt 或 git am 有序应用。
  4. 配置分离: 内核 .config 不提交到源码树,使用 defconfig + 增量片段(config-fragment-rt.cfg)管理。
  5. 持续集成: 每次补丁变更后运行 make kernelrelease 确认版本号,避免部署时混淆。
效率工具: 使用 git worktree add 在同一仓库下创建多个工作目录,同时维护 LTS 主线、RT 分支、BSP 分支,无需反复克隆。