3. PREEMPT_RT 补丁概述

PREEMPT_RT 补丁是嵌入式 Linux 实时性改造的核心技术。它通过一系列内核机制改进,将通用 Linux 内核转变为可预测的硬实时操作系统。本章将系统梳理 PREEMPT_RT 的历史演进、核心特性及其与主线内核的协同关系。

3.1 PREEMPT_RT 项目历史

PREEMPT_RT 项目起源于 2004 年,由 Thomas Gleixner、Ingo Molnar 等内核开发者发起,目标是消除 Linux 内核中导致不可预测延迟的抢占点。项目经历了三个主要阶段:

阶段 时间 关键里程碑 内核版本
原型期 2004–2006 引入中断线程化、可抢占内核锁 2.6.17–2.6.24
稳定期 2007–2015 高精度定时器、RCU 优先级继承、RT 组调度 2.6.25–4.0
主线化期 2016–至今 PREEMPT_RT 核心机制逐步合入主线 4.1–6.x
关键节点:2020 年,Linus Torvalds 在 Linux 5.10 中合并了 PREEMPT_RT 的完整抢占机制,标志着 RT 补丁从独立维护进入主线内核时代。但完整补丁集仍需单独应用。
PREEMPT_RT 项目历史演进时间线 原型期 (2004–2006) 中断线程化 · 可抢占锁 稳定期 (2007–2015) 高精度定时器 · RCU 优先级继承 主线化期 (2016–至今) 核心机制合入主线 主线化里程碑 Linux 5.10 合并完整抢占机制 → 6.x 持续优化 RT 调度器

3.2 主要特性

PREEMPT_RT 补丁集包含四大核心特性,它们共同构成了实时内核的基石:

3.2.1 完全抢占内核

传统 Linux 内核在系统调用、中断上下文等关键路径上禁止抢占,导致高优先级任务被阻塞。PREEMPT_RT 通过以下机制实现 完全可抢占:

  • 抢占点扩展:在 spinlock、RCU 读端、中断处理等所有可能阻塞的位置插入抢占点。
  • 原始自旋锁替换:将 spinlock 替换为可睡眠的 rt_mutex,允许高优先级任务抢占持有锁的低优先级任务。
  • 内核抢占模型:提供 PREEMPT_RT_FULL 配置选项,启用后内核几乎处处可抢占。
性能对比:完全抢占内核将最大调度延迟从毫秒级降至微秒级(通常 < 100 µs),但会引入约 5–15% 的吞吐量开销。

3.2.2 中断线程化

中断线程化将硬件中断处理程序转换为内核线程,使其可被调度器管理:

  • 上半部(硬中断):仅执行最必要的硬件操作(如 ACK 中断),然后唤醒对应的中断线程。
  • 下半部(线程化):中断线程以实时优先级运行,可被更高优先级任务抢占。
  • 优先级继承:中断线程继承触发中断的任务的优先级,避免优先级反转。
中断线程化处理流程 硬件中断 上半部(硬中断) ACK · 唤醒线程 下半部(线程化) 可被抢占 实时调度器 优先级管理 中断线程化后,高优先级实时任务可抢占中断下半部,避免中断延迟抖动

3.2.3 高精度定时器

高精度定时器(hrtimer)替代了传统的基于 jiffies 的定时器系统:

  • 硬件支持:利用 CPU 的 TSC、HPET 等高精度时钟源,分辨率可达纳秒级。
  • 红黑树管理:定时器按到期时间排序,O(log n) 查找效率。
  • 与 PREEMPT_RT 协同:定时器回调在可抢占的软中断或线程上下文中执行,避免阻塞实时任务。
特性 传统定时器 高精度定时器 (hrtimer)
分辨率 1/HZ(通常 1–10 ms) 纳秒级(硬件限制)
数据结构 时间轮 红黑树
回调上下文 硬中断 软中断 / 线程
实时适用性 低(抖动大) 高(可预测)

3.2.4 RCU 优先级继承

RCU(Read-Copy-Update)是 Linux 内核中广泛使用的无锁同步机制。PREEMPT_RT 为其增加了优先级继承支持:

  • 问题背景:RCU 读端临界区可能被低优先级任务持有,阻塞高优先级写端。
  • 解决方案:当高优先级任务等待 RCU 宽限期时,提升持有 RCU 锁的低优先级任务的优先级。
  • 实现方式:通过 rcu_boost 机制,在 RCU 宽限期处理中动态调整优先级。
注意事项:RCU 优先级继承会增加宽限期处理的开销,在非实时场景下建议关闭(CONFIG_RCU_BOOST=n)。

3.3 与主线内核的关系

PREEMPT_RT 与主线 Linux 内核的关系经历了从独立补丁到逐步合入的演变:

PREEMPT_RT 与主线内核关系架构 主线 Linux 内核 完全抢占 (5.10+) 高精度定时器 中断线程化 (部分) RCU 优先级继承 PREEMPT_RT 补丁集 完整中断线程化 原始自旋锁替换 RT 调度器增强 锁机制重写 已合入 待合入 主线内核已吸收约 60% 的 PREEMPT_RT 特性,剩余补丁持续合入中

当前主线内核与 PREEMPT_RT 补丁集的关系可总结为:

  • 已合入主线:完全抢占内核(5.10)、高精度定时器、RCU 优先级继承、部分中断线程化。
  • 仍需补丁:完整中断线程化、原始自旋锁替换(rt_mutex)、RT 调度器增强、锁机制重写。
  • 使用建议:对于硬实时需求(延迟 < 100 µs),必须应用完整 PREEMPT_RT 补丁集;对于软实时场景(延迟 < 1 ms),主线内核的 PREEMPT_FULL 配置通常足够。
实践要点:在嵌入式项目中,建议基于 LTS 内核(如 6.1、6.6)应用对应版本的 PREEMPT_RT 补丁,以获得长期支持和稳定性。