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 补丁从独立维护进入主线内核时代。但完整补丁集仍需单独应用。
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 中断),然后唤醒对应的中断线程。
- 下半部(线程化):中断线程以实时优先级运行,可被更高优先级任务抢占。
- 优先级继承:中断线程继承触发中断的任务的优先级,避免优先级反转。
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 补丁集的关系可总结为:
- 已合入主线:完全抢占内核(5.10)、高精度定时器、RCU 优先级继承、部分中断线程化。
- 仍需补丁:完整中断线程化、原始自旋锁替换(rt_mutex)、RT 调度器增强、锁机制重写。
- 使用建议:对于硬实时需求(延迟 < 100 µs),必须应用完整 PREEMPT_RT 补丁集;对于软实时场景(延迟 < 1 ms),主线内核的
PREEMPT_FULL配置通常足够。
实践要点:在嵌入式项目中,建议基于 LTS 内核(如 6.1、6.6)应用对应版本的 PREEMPT_RT 补丁,以获得长期支持和稳定性。