1. Linux RT 内核与 PREEMPT_RT 概述
作为一名长期从事嵌入式系统开发的工程师,我深知实时性对某些关键应用场景的重要性。Linux 内核虽然功能强大,但其默认配置并不适合硬实时任务。这就是 PREEMPT_RT(Real-Time)补丁集存在的意义 - 它通过一系列精心设计的修改,将标准 Linux 内核转变为适合实时应用的操作系统。
PREEMPT_RT 补丁最早由 Ingo Molnar 等人开发,经过多年演进,现在已经成为 Linux 实时化的标准解决方案。它主要通过以下几个方面的改进来实现实时性:
- 将中断处理程序线程化
- 实现完全可抢占的内核
- 使用优先级继承协议改进锁机制
- 优化计时器和调度器行为
这些改变使得 Linux 能够提供微秒级的响应延迟,足以满足大多数工业控制、机器人、音视频处理等实时应用的需求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. PREEMPT_RT 移植的核心要求
2.1 中断线程化
在标准 Linux 内核中,中断处理程序(ISR)运行在特殊的上下文中,不能被抢占。PREEMPT_RT 要求几乎所有中断都必须线程化,即作为普通的内核线程运行。
c复制// 强制中断线程化的配置选项
CONFIG_IRQ_FORCED_THREADING=y
必须特别注意,某些关键中断(如时钟中断)不能线程化,需要明确标记:
c复制request_irq(irq, handler, IRQF_NO_THREAD, "my_irq", dev);
在实际移植过程中,我们发现以下中断通常需要保持硬中断模式:
- 系统时钟中断
- 性能监控中断(perf)
- 级联中断控制器处理程序
2.2 抢占支持
PREEMPT_RT 要求内核必须完全支持抢占。这意味着:
- 确保 CONFIG_ARCH_NO_PREEMPT 未设置
- 调度请求必须立即处理,不能延迟
我们在移植到某 ARM 平台时,发现其 arch/arm/Kconfig 中默认设置了 ARCH_NO_PREEMPT,这会导致编译错误。解决方法是在架构的 Kconfig 中明确取消此设置:
kconfig复制config ARCH_NO_PREEMPT
bool
default n
