网站搜索

20 年后,实时 Linux 进入内核——真的


多年来,在实时 Linux 上所做的工作使开源操作系统受益匪浅,但直到本周,Linus Torvalds 才承认将其最后一部分纳入了主线内核。究竟是什么花了这么长时间?

高级实时 Linux 开发人员 Steven Rostedt 和您真诚的 Steven Vaughan-Nichols 在维也纳举行的 Linux 欧洲峰会上。

维也纳——20 年后,实时 Linux (PREEMPT_RT) 终于——终于——进入了主线内核。 Linus Torvalds 在参加欧洲开源峰会时对代码进行了祝福。为什么这很重要?让我们首先解释什么是实时操作系统 (RTOS) 以及它的用途。

什么是实时操作系统?

RTOS 是一种专门的操作系统,旨在精确可靠地处理时间关键型任务。与 Windows 或 macOS 等通用操作系统不同,RTOS 旨在在严格的时间限制(通常以毫秒或微秒为单位)内响应事件和处理数据。正如著名实时 Linux 开发人员兼 Google 工程师 Steven Rostedt 所说,“实时是最快的最坏情况。”

他的意思是,实时操作系统的基本特征是其确定性行为。实时操作系统保证关键任务将在指定的期限内完成。许多人认为 RTOS 用于快速进程。他们不是。 RTOS 的重点不是速度,而是可靠性。这种可预测性对于计时至关重要的应用至关重要,例如工业控制系统、医疗设备和航空航天设备。

目前使用的实时操作系统的一个例子是 VxWorks,它在 NASA 的火星漫游车中用于引导它们,在波音 787 梦想飞机中用于控制航空电子系统,确保飞行控制的实时响应。另一个例子是 QNX Neutrino,它广泛应用于汽车信息娱乐系统和防抱死制动等高级驾驶员辅助系统。

实时 Linux 的历史

从即将推出的 Linux 6.12 内核开始,实时 Linux 代码现已融入所有 Linux 发行版中。这意味着 Linux 很快就会开始出现在更多关键任务设备和工业硬件中。但到达这里却花了一段美好的时光。

实时 Linux 的故事始于 20 世纪 90 年代末,当时对 Linux 支持实时应用程序的需求不断增长。最初的工作重点是创建与 Linux 内核一起运行的单独的实时内核。其中包括堪萨斯大学的 KURT 等学术项目; RTAI,来自米兰大学;和新墨西哥矿业技术学院的 RTLinux。

Ingo Molnar 是一名高级 Linux 内核开发人员,他于 2004 年开始收集和重塑这些技术的各个部分,为实时抢占补丁集 PREEMPT_RT 奠定了基础。

这种方法与早期的实时 Linux 解决方案不同,因为它修改了现有的 Linux 内核,而不是创建单独的实时内核。到 2006 年,它已经获得了足够的关注,Linus Torvalds 观察到,“用 Linux 控制激光器是疯狂的,但这个房间里的每个人都以自己的方式疯狂。所以如果你想使用 Linux 来控制工业焊接激光器,我有使用 PREEMPT_RT 没问题。”

到 2009 年,一小群内核开发人员(包括 Thomas Gleixner、Peter Ziljstra 和 Rostedt)已将之前的原型开发整合到一个树外补丁集中。就在那时,许多公司开始使用这个补丁集来构建需要毫秒精度的硬实时特性的工业系统。

随着项目的推进,它的许多元素都转移到了内核中。 Rostedt 告诉我,在某种程度上,说 Linux 现在才实现实时是错误的。多年来,它的许多功能已被引入主流 Linux。事实上,其中一些对于您每天使用的 Linux 来说是必不可少的。

例如,您可能从未听说过“NO_HZ”,它可以降低空闲系统中的功耗。 NO_HZ 使 Linux 能够在具有数千个 CPU 的机器上高效运行。 “你不会意识到 Linux 由于实时补丁而得到了多大的改进,”Rostedt 强调。 “今天 Linux 在数据中心运行的唯一原因是我们所做的工作。”

因此,如果没有 NO_HZ,Linux 基本上不会运行在所有数据中心。这反过来又解释了为什么 Linux 运行云。我不知道如果没有这种实时贡献,世界会是什么样子,但它看起来不会像今天这样。

事实证明,实时 Linux 的用处是人们一开始从未梦想过的。 Rostedt 回忆道,“早在 2005 年,我收到了一份实时错误报告,我发送了一个补丁并说,‘嘿,这是修复程序。你能应用它吗?’”那家伙说,“我不知道我在做什么。”我回答说:“等等,你不是内核开发人员吗?”他回答说,‘我是一名吉他手。’”

事实证明,他之所以使用早期的实时补丁,是因为他使用的是 JACK,即用于低延迟音频连接的声音服务器。他使用它是因为,像大多数音乐家一样,他太穷了,无法购买高端设备,因此,Rostedt 继续说道,“他买了一台便宜的笔记本电脑,配有 Linux 和 JACK,因为有了实时补丁,它可以进行良好的录音。当硬盘驱动器正在写入时跳过。”

事实证明,很多音乐家都是早期的实时 Linux 用户,因为它可以让他们以低廉的价格制作出高质量的录音。谁知道?多年来已融入主线内核的其他实时 Linux 功能包括:

  • 互斥锁的介绍
  • Ftrace,可以说是最重要的 Linux 调试工具
  • 用户空间应用程序的优先级继承

是什么让实时 Linux 花了这么长时间?

那么,为什么实时Linux现在才在内核中得到完全加持呢? “实际上,除非我们认为已经准备好,否则我们不会推出任何东西,”罗斯特解释道。 “几乎所有内容在进入主线之前通常都会被重写至少三遍,因为我们对进入主线的内容有很高的门槛。”

此外,通往主线的道路不仅仅是技术挑战。政治和观念也发挥了作用。 “一开始,我们甚至无法提及实时,”罗斯特回忆道。 “每个人都说,‘哦,我们不在乎实时性。’”

另一个问题是钱。多年来,实时 Linux 的资金投入一直不稳定。 2015 年,Linux 基金会建立了实时 Linux (RTL) 协作项目,以协调围绕 PREEMPT_RT 主流化的工作。

完全集成的最后一个障碍是重新设计内核的 print_k 函数,这是一个可以追溯到 1991 年的重要调试工具。Torvalds 特别保护 printk ——他编写了原始代码,并且仍然使用它进行调试。然而,printk 也会在 Linux 程序被调用时施加硬延迟。这种速度减慢在实时系统中是不可接受的。

Rostedt 解释道:“Printk 有一千种技巧来处理一千种不同的情况。每当我们修改 printk 来做某事时,它都会破坏其中一种情况。printk 对于调试的好处在于,当出现错误时,您可以准确地知道自己在哪里。当我非常非常用力地敲击系统时,延迟大约在 30 微秒左右,然后突然跳到 5 毫秒。”这个延迟就是 printk 消息。

经过大量工作、多次激烈讨论和数项被拒绝的提案,今年早些时候达成了妥协。 Torvalds 很高兴,实时 Linux 开发人员很高兴,printk 用户很高兴,最后,实时 Linux 成为了现实。

经过二十年的发展,Linux实时补丁终于被合并到主线内核中。这一里程碑标志着内核开发人员多年来为 Linux 带来确定性、低延迟性能的工作的顶峰。

有了它,Linux 内核是完全可抢占的,这使得它能够在微秒内响应事件。此功能对于需要精确计时的应用至关重要,例如工业控制系统、机器人和音频制作。

随着实时补丁的合并,Linux 现在已准备好成为 RTOS 世界中的重要参与者。这不仅是实时制造商的胜利,也是所有 Linux 用户的胜利。

相关文章