4. PREEMPT_RT 补丁简介

PREEMPT_RT 补丁集是 Linux 内核实现硬实时能力的关键技术。本章将系统介绍 PREEMPT_RT 项目的起源、社区生态、补丁架构及其与主线内核的协同关系,帮助开发者理解这一实时化方案的全貌。

4.1 PREEMPT_RT 项目历史

PREEMPT_RT 项目始于 2004 年,由 Thomas Gleixner 和 Ingo Molnar 发起,旨在将 Linux 内核改造为支持硬实时(Hard Real-Time)的系统。其发展历程可分为四个关键阶段:

阶段 时间 里程碑 核心贡献者
萌芽期 2004–2006 首次发布 PREEMPT_RT 补丁,引入可抢占内核锁 Thomas Gleixner, Ingo Molnar
稳定期 2007–2012 补丁集成熟,被广泛用于工业、航空航天领域 Peter Zijlstra, Steven Rostedt
主线化期 2013–2019 大量 PREEMPT_RT 特性被合入主线内核 Thomas Gleixner, Peter Zijlstra
合并冲刺期 2020–至今 主线内核逐步吸收剩余补丁,预计 6.x 系列完成合并 Thomas Gleixner, Sebastian Siewior
关键节点:2020 年,Linux 基金会宣布 PREEMPT_RT 补丁集将逐步合并到主线内核。截至 Linux 6.12,约 85% 的 PREEMPT_RT 特性已进入主线,剩余部分(如中断线程化、高精度定时器)正在最后审查阶段。
PREEMPT_RT 项目发展时间线 2004 项目启动 Thomas Gleixner 2007 稳定版发布 工业级应用 2015 主线化开始 逐步合入主线 2024 合并冲刺 预计 6.x 完成 PREEMPT_RT 从独立补丁集逐步演变为主线内核的一部分

4.2 维护者与社区

PREEMPT_RT 项目由 Linux 基金会下的 Real-Time Linux (RTL) 协作项目 管理,核心维护者团队负责补丁审查、版本发布和主线化推进。

4.2.1 核心维护者

姓名 角色 所属机构 主要贡献领域
Thomas Gleixner 项目创始人 & 首席维护者 Linutronix 中断线程化、高精度定时器、锁原语
Peter Zijlstra 核心维护者 Intel 调度器、RCU、原子操作
Steven Rostedt 核心维护者 VMware ftrace、抢占模型、调试工具
Sebastian Siewior 维护者 Linutronix 补丁集整合、主线化推进

4.2.2 社区协作模式

  • 邮件列表:linux-rt-users@vger.kernel.org 和 linux-rt-devel@lists.linuxfoundation.org 是主要讨论渠道。
  • 版本发布:PREEMPT_RT 补丁集跟随主线内核版本发布,通常滞后 1–2 个版本。
  • 代码审查:所有补丁需经过至少 2 位核心维护者 Acked-by 才能合入。
  • 测试基础设施:RTL 项目维护着持续集成(CI)系统,覆盖 x86、ARM、RISC-V 等架构。
社区参与建议:新手开发者可以从 linux-rt-users 邮件列表开始,关注 PREEMPT_RT 标签的补丁讨论。贡献代码前,建议先阅读 Documentation/rt/ 目录下的文档。
PREEMPT_RT 社区协作架构 Linux 基金会 RTL 协作项目 核心维护者团队 社区贡献者 测试与 CI 团队 PREEMPT_RT 补丁集 / 主线内核合入 / 文档与工具 社区通过邮件列表、IRC 和年度 RT 研讨会协作

4.3 补丁集架构

PREEMPT_RT 补丁集并非单一补丁,而是由约 200 个补丁组成的系列,按功能分为多个子系统。其核心架构围绕 可抢占性 和 确定性 展开。

4.3.1 补丁集分层结构

层级 补丁组 功能描述 补丁数量(估算)
L1 中断线程化 将硬中断处理程序转换为内核线程,降低中断延迟 30
L2 可抢占锁 将自旋锁、读写锁替换为可抢占的 rt_mutex 实现 50
L3 高精度定时器 引入 hrtimer 系统,提供纳秒级定时精度 20
L4 RCU 抢占支持 使 RCU 读侧临界区可被抢占 15
L5 调度器增强 优化实时调度类(SCHED_FIFO/SCHED_RR)的调度延迟 25
L6 调试与跟踪 提供 rt-latency、trace 等调试工具 60

4.3.2 关键补丁组详解

  • 中断线程化(Interrupt Threading):将 request_irq() 注册的中断处理程序改为运行在可抢占的内核线程中,避免中断上下文阻塞高优先级任务。
  • 可抢占锁(Preemptible Locking):自旋锁在 RT 内核中退化为 rt_mutex,支持优先级继承,防止优先级反转。
  • 高精度定时器(hrtimer):基于红黑树实现,定时精度仅受硬件限制,不再依赖 jiffies。
注意:PREEMPT_RT 补丁集并非所有架构都完全支持。x86、ARM64、RISC-V 是主要目标架构,而 ARM32、MIPS 等架构的支持可能滞后。在移植前,请查阅 Documentation/rt/arch-support.txt。
PREEMPT_RT 补丁集分层架构 实时应用程序 L1: 中断线程化 L2: 可抢占锁 L3: 高精度定时器 L4: RCU 抢占支持 L5: 调度器增强 L6: 调试与跟踪 主线 Linux 内核(基础子系统) 补丁集按功能分层,上层依赖下层 L1-L3 是实时化的核心,L4-L6 提供增强和调试能力

4.4 与主线内核的关系

PREEMPT_RT 补丁集与主线内核的关系经历了从 独立维护 到 逐步合并 的演变。理解这一关系对于内核版本选择和迁移策略至关重要。

4.4.1 主线化进程

自 Linux 3.14 起,主线内核开始吸收 PREEMPT_RT 特性。以下表格展示了关键主线版本中合入的 RT 特性:

主线版本 合入的 PREEMPT_RT 特性 当前状态
3.14 RT 调度类增强、部分锁原语优化 已合入
4.4 hrtimer 改进、中断线程化基础框架 已合入
5.10 可抢占 RCU、PREEMPT_RT 配置选项 已合入
6.1 完整的中断线程化、rt_mutex 重写 已合入
6.6 剩余锁原语替换、调试工具集成 已合入
6.12 (预计) 最后一批补丁(约 30 个) 审查中

4.4.2 当前差异

截至 Linux 6.6,主线内核与完整 PREEMPT_RT 补丁集的主要差异包括:

  • 中断线程化:主线已支持基本框架,但部分驱动的中断处理函数尚未完全线程化。
  • 锁原语:主线中的 spin_lock() 在 RT 内核中仍为可抢占实现,但部分架构的原子操作尚未完全优化。
  • 调试工具:主线缺少 rt-latency 和 trace-cmd 的 RT 专用插件。
  • 配置选项:主线已提供 CONFIG_PREEMPT_RT,但部分子系统的依赖尚未完全解决。
迁移建议:对于新项目,建议直接使用主线内核(≥ 6.6)并启用 CONFIG_PREEMPT_RT。对于需要完整 RT 特性的场景,可继续使用独立 PREEMPT_RT 补丁集,但需注意版本匹配。
PREEMPT_RT 与主线内核的关系演变 独立 PREEMPT_RT 补丁集 逐步合入主线 2004–2024 主线内核 CONFIG_PREEMPT_RT 当前状态:约 85% 的 PREEMPT_RT 特性已合入主线 剩余补丁集中在中断线程化和锁原语优化 预计 Linux 6.12 完成全部合并 届时 PREEMPT_RT 将成为主线内核的标准配置

4.5 小结