3. PREEMPT_RT 补丁简介

PREEMPT_RT(Real-Time Linux)补丁集是 Linux 内核实现硬实时能力的关键技术路径。它通过一系列精细化的内核抢占与锁机制改造,将通用 Linux 内核转变为可预测的实时操作系统内核。本节将系统梳理 PREEMPT_RT 的项目历史、核心目标、与主线内核的演进关系以及当前支持的硬件架构。

PREEMPT_RT 项目全景概览 项目历史 2005 → 至今 主要目标 确定性 & 低延迟 主线关系 逐步合入主线 Ingo Molnar 发起 抢占锁 + 优先级继承 v5.15 主线里程碑 PREEMPT_RT 是 Linux 基金会支持的官方实时内核项目,已进入主线内核

3.1 项目历史

PREEMPT_RT 项目起源于 2005 年,由 Linux 内核开发者 Ingo Molnar 发起,最初作为一组独立的内核补丁发布。其发展历程可分为三个关键阶段:

阶段 时间 关键事件
初创期 2005 – 2009 Ingo Molnar 发布首个 PREEMPT_RT 补丁集;Thomas Gleixner 接管维护;引入 RT-mutex、优先级继承等核心机制
稳定期 2009 – 2019 补丁集趋于稳定;Linux 基金会成立 Real-Time Linux 协作项目(RTL);开始向主线内核逐步提交代码
主线化期 2019 – 至今 PREEMPT_RT 核心功能陆续合入主线;v5.15 内核正式包含 PREEMPT_RT 配置选项;持续完善剩余功能

关键里程碑:Linux 内核 v5.15(2021 年 10 月发布)首次在主线内核中提供了 CONFIG_PREEMPT_RT 配置选项,标志着 PREEMPT_RT 从独立补丁集正式成为主线内核的一部分。

3.2 主要目标

PREEMPT_RT 的核心目标是将 Linux 内核改造为完全可抢占的实时操作系统,使系统能够满足硬实时应用对确定性和低延迟的要求。具体目标包括:

  • 消除不可抢占区域:将内核中所有不可抢占的临界区(如自旋锁、中断上下文)改造为可抢占的 RT-mutex 或可睡眠锁。
  • 降低中断延迟:将中断处理程序线程化(IRQ threading),使高优先级任务可以抢占中断处理。
  • 实现优先级继承:通过 RT-mutex 机制解决优先级反转问题,确保实时任务的调度确定性。
  • 减少关闭本地中断的时间:最小化 local_irq_disable() 等操作的持续时间,降低对实时任务的影响。
  • 提供可预测的调度延迟:保证在最坏情况下,最高优先级任务的唤醒延迟和调度延迟在微秒级范围内。
PREEMPT_RT 核心改造目标 完全可抢占内核 RT-mutex + 优先级继承 中断线程化 可睡眠自旋锁 最小化关中断 目标:最坏情况中断延迟 < 100μs,调度延迟 < 50μs

3.3 与主线内核的关系

PREEMPT_RT 与主线 Linux 内核的关系经历了从独立补丁集到逐步合入主线的演进过程。当前状态如下:

内核版本 PREEMPT_RT 状态 说明
v5.14 及之前 独立补丁集 需要手动应用 PREEMPT_RT 补丁到对应内核版本
v5.15 – v6.1 部分主线化 CONFIG_PREEMPT_RT 选项可用,但部分功能仍需补丁
v6.2 及之后 深度主线化 核心机制已合入主线,仅少数架构相关代码需额外补丁

实践建议:对于生产环境,建议使用 LTS 内核(如 v6.1.y 或 v6.6.y)配合对应的 PREEMPT_RT 补丁集,以获得长期支持和稳定性保障。

主线内核目前提供三种抢占模型,可通过内核配置选择:

  • CONFIG_PREEMPT_NONE — 无抢占(服务器场景)
  • CONFIG_PREEMPT_VOLUNTARY — 自愿抢占(桌面场景)
  • CONFIG_PREEMPT — 低延迟抢占(通用实时场景)
  • CONFIG_PREEMPT_RT — 完全实时抢占(硬实时场景,需 PREEMPT_RT 支持)

3.4 支持的架构

PREEMPT_RT 补丁集支持多种硬件架构,覆盖从嵌入式设备到服务器系统的广泛范围。以下为主要支持的架构及其状态:

架构 支持状态 典型应用场景
x86 / x86_64 完全支持 工业 PC、边缘服务器、实时控制
ARM / ARM64 完全支持 嵌入式实时系统、机器人、无人机
PowerPC 完全支持 工业自动化、电力系统
RISC-V 实验性支持 新兴嵌入式平台、开源硬件
MIPS 部分支持 老旧嵌入式系统、网络设备
ARC 部分支持 超低功耗嵌入式设备
PREEMPT_RT 架构支持图谱 完全支持 x86 / x86_64 ARM / ARM64 PowerPC 部分支持 MIPS ARC 实验性支持 RISC-V 选择架构时需确认对应内核版本中 PREEMPT_RT 补丁的可用性

架构选择注意事项:对于 RISC-V 等实验性支持的架构,建议先在目标硬件上验证 PREEMPT_RT 补丁的完整性和稳定性,再进行生产部署。部分架构可能缺少对中断线程化或 RT-mutex 的完整支持。

3.5 内核配置示例

启用 PREEMPT_RT 需要在内核配置中选择对应的抢占模型。以下为典型的配置片段:

# 启用 PREEMPT_RT 完全实时抢占
CONFIG_PREEMPT_RT=y
CONFIG_PREEMPT_RT_FULL=y

# 相关依赖配置
CONFIG_EXPERT=y
CONFIG_PREEMPT_COUNT=y
CONFIG_PREEMPTION=y
CONFIG_PREEMPT_DYNAMIC=y

# 中断线程化(PREEMPT_RT 默认启用)
CONFIG_IRQ_FORCED_THREADING=y

# RT-mutex 支持
CONFIG_RT_MUTEXES=y
CONFIG_DEBUG_RT_MUTEXES=n   # 调试选项,生产环境建议关闭

配置建议:使用 make menuconfig 进入内核配置界面,在 "Processor type and features" → "Preemption Model" 中选择 "Fully Preemptible Kernel (Real-Time)" 即可自动设置相关依赖选项。