在 2024 年 9 月的欧洲开源峰会上,Linus Torvalds 宣布 ‘PREEMPT_RT’(Real-Time Linux) 补丁已被接受合并到 Linux 主线内核。
从 Linux 6.12 开始,所有发行版都将包含实时 Linux 代码。这意味着 Linux 将开始运行在更多任务关键设备 (mission-critical devices) 和工业硬件上。
通过 ‘PREEMPT_RT’ 补丁,Linux 内核实现了完全可抢占 (fully preemptible) 特性,从而能够在微秒内响应事件。
这一能力对于需要精确时间控制的应用程序至关重要,如工业控制系统、机器人技术和音频制作。
via https://wiki.linuxfoundation.org/realtime/start
PREEMPT_RT 补丁从 2004 年开始启动开发工作,为 Linux 内核实现了实时计算能力。事实上,实时 Linux (Real-time Linux) 的故事最早可追溯到 20 世纪 90 年代后期,当时 Linux 需要支持实时应用的需求日益增长。
最初的尝试集中在创建可以与 Linux 内核并行运行的独立实时内核。这包括堪萨斯大学的 KURT;米兰大学的 RTAI;以及新墨西哥矿业与科技学院的 RTLinux 等学术项目。
Linux 内核开发者 Ingo Molnar 于 2004 年开始收集并重新整理这些项目的代码片段,并构建了实时抢占补丁 (real-time preemption) PREEMPT_RT 的基础。
这种方法与早期的实时 Linux 解决方案不同,因为它修改了现有的 Linux 内核,而不是创建一个单独的实时内核。
到 2006 年,它获得了广泛关注,以至于 Linus Torvalds 评价称:"用 Linux 控制激光器太疯狂了,但在座各位都有自己的疯狂之处。因此,如果你想用 Linux 来控制工业焊接激光器,我对你使用 PREEMPT_RT 没有意见。”
2009 年,内核开发者 Thomas Gleixner、Peter Ziljstra 和 Rostedt 组建了小团队,将之前的原型开发整合成一个单一的树外补丁集。
正是从那时起,许多公司开始使用这个补丁集来构建需要毫秒级精度的强实时工业系统。
2015 年,Linux 基金会创建 Real-Time Linux (RTL) 协作项目,以协调将 PREEMPT_RT 补丁合并到主线内核。
但要将 PREEMPT_RT 补丁完整合并到内核还面临着最后一个障碍:重新设计 print_k 函数。
这是一个可以追溯到 1991 年的关键调试工具,最早是 Linus Torvalds 本人开发用于调试。然而,每当 Linux 程序调用 print_k 时就会产生硬延迟。这在实时系统中是不可接受的。
Rostedt 解释道:“print_k 有千百种‘hacks’技巧,用来处理上千种不同的情况。每当我们将 print_k 修改为执行某种操作时,就会破坏这些情况之一。print_k 在调试中可以让开发者确切知道进程崩溃时对应的代码定位。如果对系统进行高强度测试,延迟主要在大约 30 微秒左右,但随后会突然变成 5 毫秒。这个延迟就是 print_k 消息。
经过大量工作,许多激烈的讨论,以及几次被拒绝的提案,今年初 Linux 内核社区终于在重新 print_k 上达成了一致。
随着 ‘PREEMPT_RT’ 补丁的合并,相信 Linux 将会在实时操作系统领域成为有力的竞争者。这不仅对实时系统制造商来说是一个胜利,也是所有 Linux 用户的胜利。
延伸阅读
- Canonical 发布实时内核 (Real-time) 版 Ubuntu 24.04 LTS
- Ubuntu 的实时内核 (Real-Time Kernel) 接近 GA 状态