2022年嵌入式Linux的进展

The 2022 embedded Linux update

Embedded Linux Conference(ELC)的一个常规内容是会议组织者 Tim Bird 对嵌入式 Linux 状况的更新。我已经有好几年没有机会参加了,所以这次德克萨斯州奥斯汀举行的 2022 年北美开源峰会(OSSNA)我就去参加了一下。OSSNA 是一个总括性的会议(umbrella conference),现在包含了 ELC 以及其他很多内容。Bird 从嵌入式的角度介绍了内核里最新的相关功能,谈到了若干种各不相同的技术领域及其对嵌入式 Linux 的影响,还试图回答 Andrew Morton 在 2008 年 ELC 的主题演讲中提出的一个问题。

Bird 有众多职务,其中之一就是 ELC 的 program committee chair,并且他是索尼电子的首席软件工程师。他首先介绍说,他正试图将他平常在各种活动中经常发表的演讲从通常的一个半小时压缩到 40 分钟。因此,他警告与会者他会讲得非常快。他演讲的主要目标是介绍那些已经添加到 Linux 内核中的新技术,以便与会者可以将这些技术加入他们的产品中,同时也会在生态系统中开始讨论大家需要关注的领域。

Past

Bird 于 1993 年开始了他的 Linux 之旅,并于 1998 年在 Lineo 公司转向开始了嵌入式 Linux 开发。2003 年他跳槽到索尼公司,受雇于该公司来帮助创建消费电子 Linux 论坛(CELF),该论坛于 2005 年开始举办 "Embedded Linux Technical Conference"。这就是 ELC 的前身了。2010 年,CELF 转到了 Linux 基金会的旗下,成为 Core Embedded Linux Project。

在 20 世纪 90 年代末,为了说服各个公司相信 Linux 是嵌入式项目的一个好选择,大家花费了大量的时间和精力。当时的竞争者是商业版本的实时操作系统(RTOS)和 "公司自己做的一大堆自己攒出来的 bare-metal 的内容"。当时的主要体系架构英特尔、Arm 和 MIPS,都支持 Linux,但没有一家主要的芯片供应商在为内核进行架构开发和支持;这部分工作是由志愿者和嵌入式 Linux 公司完成。发行版要么是自己准备,要么就是来自几个供应商之一(如 MontaVista、Lineo、TimeSys)。

CELF 一开始做的第一件事就是分析 Linux,找出需要改进的地方,以使其适用于嵌入式设备。2003 年,CELF 确定了五个具体的领域:系统规模(system size)、启动时间(boot time)、电源管理(power management)、实时性和安全性。然后,该组织资助了这些领域的几个内核功能(以及其他一些领域,如文件系统)。

所以,目前已经做了很多工作,而且已经过去将近 20 年了,"我们还没有完成吗?" 这个问题来自于 Morton 在 2008 年的主题演讲,也许是一个小小的玩笑,但它至今仍困扰着 Bird。顺便说一下,他指出,得感谢 Bootlin,所以该讲座的视频仍然存在,在录制该讲座时 Bootlin 仍被称为 Free Electrons(当年还录制了许多其他视频)。Morton 的谈话仍然是有意义的,"他当年说的东西今天仍然适用,这很令人惊讶"。

Kernel features

然后,Bird 从嵌入式开发者感兴趣的功能和改动出发,对去年的内核 release 进行了一次旋风式的参观。当然,在每个版本中都有很多用于其他用途的功能,他不会涵盖这些部分。此外,他说也不会过多提及新内核版本中的不同驱动或新的片上系统(SoC)支持。

[Tim Bird]

从 2021 年 8 月的 Linux 5.14 开始介绍,该版本增加了对调查 realtime kernel 有帮助的 osnoise 和 timerlat tracer,还针对各种设备添加了高通和联发科的新的驱动,还有一个 simpledrm 驱动,用来给简单的 framebuffer device(嵌入式系统中经常出现的设备)来提供直接渲染管理器(DRM, direct-rendering manager)接口。5.14 中最重要的针对嵌入式的功能是增加了 memfd_secret()系统调用。它创建了一个其他进程无法访问到的内存区域,哪怕是内核自己也很难访问到这个区域,所以它是一个存储秘密数据的好地方,比如可以存放加密密钥。Bird 推荐了一篇 LWN 文章以及相关 commit 来帮助大家了解更多信息。

2021 年 10 月的内核 5.15 带来了 sleeping spinlocks,这是实时(即 PREEMPT_RT)patch set 的一个核心部分;他将在讲座的后面对 realtime 进行更多的介绍。调度器获得了对非对称系统(asymmetric systems)的支持,在同一芯片上的内核不能同时运行 32 位和 64 位代码,因此调度器在将进程迁移到不同 CPU core 的时候需要记住这一点。那些开发网络连接存储(NAS)设备的人可能想看看内核内的 SMB 服务器,ksmbd,它在 5.15 合入的。

该内核的另一个特性是 printk() indexing 功能,它为那些开发 log 文件处理工具的开发者提供了一种方法,可以在 printk()信息发生变化的时候能够知道。这样一来这些工具在正则表达式突然无法匹配时就不用只能悄悄失败了,而是可以正确地适配。由于许多嵌入式开发者使用了旧的内核(通常是由 SoC 或电路板开发商所提供的),当他们有一天转移到 5.15 或更高版本的内核时,他们可能会感到惊讶,因为现在的 mainline 的 build 默认带有 -Werror 标志。该标志会将编译器的 warning 变成了 error,因此,当在较新的内核上使用含有 warning 的代码时,会发生编译失败。

此外,还增加了 "data access monitor"(DAMON)工具。它提供了一种记录内核中数据访问模式并进行可视化的方法。这是一个诊断工具,就像 Linux 中的其他 tracer 一样,"但它实际上功能更强吗?" 而且,事实上,我们在 5.16 中看到,DAMON 除了 monitoring 这种监控功能之外还有其他功能,Bird 说。

2022 年 1 月的 5.16 内核还增加了增强型只读文件系统(EROFS)的功能。尤其是可以支持多个设备了。用于异步 I/O 的 io_uring 功能已经迅速发展起来;它可能值得嵌入式产品采用。在 5.16 中,io_uring 支持了 SELinux 和 Smack 的安全策略的 enforcement 的功能。DAMON 操作方案(DAMOS, DAMON operating schemes)也合入了进来,用来帮助 proactive reclaim 内存积极回收;DAMOS 可以向内核提供提示信息,说明应该着重针对哪些内存区域来进行。他说,这可能对内存很有限的嵌入式产品特别有用。

3 月,5.17 版本内核发布。现在可以在内核内部对 kernel module 进行解压缩,而不用依赖用户空间来解压了。这对某些安全启动方案和 LoadPin 安全模块来说非常重要。实时 Linux 分析工具(RTLA, realtime Linux analysis tool)也被添加进来;它使用了 5.14 中添加的 osnoise 和 timerlat tracer。此外,用户空间文件系统(FUSE)设施的 FUSE_INIT 命令中的一些 flag 字段改变了。因此,使用 FUSE 文件系统的系统在转移到 5.17 及以后的版本时,应该检查一下来确保兼容。

5.18 内核于 5 月发布,其中有几项内容是嵌入式社区感兴趣的。例如,删除了对老式 Arm MMU-less 架构(ARMv4 和 ARMv5)的支持。"内核代码并不总是真的越变越大的,有时也会删除一些东西"。不过,在 ARMv7 系列中仍有对 MMU-less 系统的支持。除此之外,还增加了对 RISC-V 的支持,tracing 子系统增加了用户空间应用中的 dynamic tracepoint 的 user_events 支持,而且内核现在是用 C11 而不是 C89 构建的了。

在即将到来的 5.19 内核中,最大的新闻是 Arm 多平台内核的工作即将完成。在过去的 12 年里,人们一直在努力整合所有的 Arm 内核,从而可以让一个内核镜像文件就可以在所有的 Arm 系统上启动,只需提供一个根据相关板子来写的 devicetree 文件就行。此外,还增加了新的 RISC 架构的支持,即 LoongArch,以及一个新的硬件时间戳引擎,他将在今后进一步讨论。

Bird 花了一点时间来介绍一些内核开发的统计数据,这些数据对于 LWN 的读者来说是很熟悉的。他说,这是因为大多数统计数字以及他在幻灯片中使用的许多链接都来自 LWN。

Technology

他再次为自己快速的介绍表示歉意,接着谈到了嵌入式开发者感兴趣的不同的技术领域。他说,另一组来自更加冗长版本的幻灯片可能有助于细化一些内容。他从音频开始介绍,指出 PipeWire 是一个新兴的项目,嵌入式公司可能会需要关注一下,但 PulseAudio 仍然是一个主要玩家,5月份发布了 16.0 版本。

他列举了一些他已经说过的 "core kernel" 方面的变动,但对切换到 C11 的这一点做了一些扩展解读。这主要是因为 speculative execution 漏洞(如 Spectre)及其与内核 macro 的交互配合问题。事实证明,能够在循环内声明变量(这在 C89 中是不可能的)对此类问题中的某些类型是有缓解作用的。

另一个 "内核核心部分的大新闻 "是 Rust for Linux 项目。它目前是一个内核代码树之外的 patch set,大约有 35000 行代码,人们认为仍然是实验性的。这些 patch 最近被迁移到较新的 Rust 语言版本(1.59)上了;他说对于语言版本变化的速度"有一些抱怨"。关于这个项目的各个方面已经有过了争论,包括当时那一周在 ksummit-discuss 邮件列表中进行的争论。大多数内核开发者都对该项目持 "wait and see" 的态度,Bird 说。

对于文件系统和 I/O 来说,各方面的情况正在更加成熟,包括 io_uring;有一些用于 io_uring 的 zero-copy 网络相关 patch 正在 "飞来飞去" 进行 review,他说。与此同时,EROFS 和 Flash-Friendly File System(F2FS)对压缩功能以及扩展属性(xattrs)有更好的支持。

在图形方面,有 "几件小事和几件大事"。从小事来说,5.14 中增加了 simpledrm 驱动,而且 framebuffer 设备(fbdev)子系统有了新的维护者。后者对嵌入式领域特别重要,因为这个领域中仍然有一些旧的设备需要继续支持。

大事方面,Mali GPU 现在有一个完全符合 OpenGL ES 3.1 标准的开源驱动程序,名为 Panfrost。此外,英伟达公司还宣布将其部分代码作为开源代码发布。"这代表了英伟达的一个重大转变"。不过,他不确定这对一直致力于为英伟达硬件开发开源驱动程序的 nouveau 项目会产生什么影响。

"在网络方面总是有持续的一些奇怪功能正在进行中"。他说,在新协议方面的工作并不多,而那些被加入的晦涩的协议与嵌入式世界也并不真正相关。不过确实提供丢包原因的新机制将有助于诊断这种类型的问题。

Realtime and more

PREEMPT_RT 这个 patch set 的进展是 "非常、非常大的新闻",Bird 说。在过去的几个版本中,越来越多的 realtime Linux 的 patch 已经进入 mainline,首先是 5.15 中添加的 sleeping spinlock。这种睡眠自旋锁允许另一个 task 在 lock 已被持有时被调度运行,这就是实时内核可以提供低延迟保证的主要原因。它们 "可能是 PREEMPT_RT patch set 的核心功能"。

目前来看,realtime patch 在该项目 17 年的历史中已经进行了 "广泛地测试和验证"。自然就会有一个问题:"还剩下些什么没有做的?" 还有大约 50 个 patch 中的约 1300 行代码。虽然这听起来很多,但实际上并非如此;"与之前的情况相比,剩余这么一点代码简直是令人难以置信的"。事实上,仅从 2 月份开始,就又有 1700 行代码经过一个 patch set 而合并。

在安全领域,他注意到 5.13 中的一些控制流完整性(CFI)的变动,这个可以帮助确保内核中的 jump 都能跳到它们应该去的地方。5.16 版的 memcpy() 边界检查会有助于防止内存里的 memcpy 来超出其 buffer 的范围。此外,还有源源不断的 Spectre 的缓解措施被添加进来,不过他发现了一个有意思的地方,就是在 5.16 版本中还删除了一个 Spectre 缓解措施,因为它实际上并没有在提高安全性方面起到什么作用,而且还有很大的性能代价。

在内核测试领域,有很多测试正在进行,许多报告都被提交给 upstream 的内核开发者,这些报告来自 0-day 测试机器人、KernelCI、Syzbot 等等。Bird 说,一个新的自动化测试框架 Compass CI 也很值得关注。它是由现在在华为工作的 Fengguang Wu 开发的,他曾开发过 0-day 测试机器人。此外各种测试套件,如 LTP、kselftest 和 Kunit 都发布了新版本以及增加了新的测试。

在工具链方面,GCC 在 5 月发布了 12.1 版本。其中对未初始化的变量进行了更好的处理,同时还有一些静态分析功能。LLVM 也在 5 月份发布了一个版本(14.0.4 版)。Bird 说,目前有些人正在使用 LLVM 来构建整个发行版,而不仅仅是内核。

5.18 版中的硬件时间戳引擎的支持是对 Linux 中 tracing 功能的一个很好的补充。它提供了一种访问硬件的机制,可以自动将时间戳添加到硬件的事件上,而不需要软件中断,这对于低开销的 tracing 很有用。

到此就结束了他的旋风之旅,这些介绍肯定是非常简短的,但其目的是让听众能知道对他们可以使用的各种功能应该搜索什么词来进一步了解。这应该能让他们从其他渠道寻求到更多的信息,从而帮助他们开发新的产品,以及转移到更新的内核。

Mars

Bird 谈到了一个 "有趣的嵌入式 Linux 用例",这个用例最近在新闻中出现了很多次:Mars Ingenuity 直升机。Bird 说,多年来他一直在问。"我们在火星上有 Linux 了吗?" 事实证明,我们终于做到了。这架直升机有一些商用的 off-the-shelf 硬件(COTS)是在运行 Linux 的。

Ingenuity 于 2021 年 2 月落地,当年 4 月和 5 月的前五次飞行纯粹是 "技术演示",但它的效果非常好,已经进行了更多的飞行,目前共飞行了 29 次。其中一次飞行能够拍摄其 "backshell" 导致的碎片区域的照片,这是其降落到地表时产生的。Bird 说,那是美国宇航局第一次能够获得如此详细的航天器落地地点的照片。这不仅是一张有趣的照片,而且它的细节可以用来分析以了解更多关于火星的信息。

Bird 似乎对直升机在恶劣环境中的生存能力特别兴奋;例如,现在是火星的冬天,灰尘减少了太阳能电池板所能提供的充电量,所以设备在晚上必须完全关闭。这意味着 COTS CPU 的运行远远超出了定义规格,因为夜间就到达了-80℃;有趣的是,直升机上的一些硬件来自 SparkFun 业余爱好者电子公司(hobbyist-electronics company),他笑着说。

寒冷有时会导致通信中断,原因是 clock 出问题。而且还导致倾角仪(inclinometer)损坏。美国宇航局计划发送一个软件 patch,使直升机能够使用其他传感器来替代倾角仪的数据。"他们要在火星上进行现场软件更新"。他的幻灯片上有很多链接,可以获得更多信息。"我认为这是太阳系中嵌入式 Linux 最有趣的用途之一,"他笑着说。

Scorecards

Bird 有三张 "记分卡" 来判断嵌入式 Linux 多年来在技术、开发和市场方面的进展。早在 2003 年,CELF 已经确定了五个需要关注的领域,根据过去几年对内核的贡献,这些领域显然现在已经达到了 "done" 的状态。如今,system size、启动时间和电源管理方面的 patch 很少,实时性正如他之前所说的那样已经 "完成",而安全性始终是一项正在进行的工作。"所以恭喜大家,我们成功了。"

当然,事情并不完全是这样的。现在很少有 system-size 方面的 patch,原因是 "我们有些放弃了"。他说,Linux 永远不会运行在一分钱的处理器上,所以 10 万亿的物联网传感器会需要运行其他系统。在启动时间方面也有类似的情况;现在的设备正在使用各种技巧,如 suspend/resume 或进入低功耗状态来避免完全重新启动。"你认为你的电视是关机的,其实它并没有。"

他说,电源管理更像是一个灰色地带。大部分所需的功能都在 upstream 了,但需要由电路板供应商来实际整合这些功能。实时性基本上已经完成,尽管它和其他大多数领域一样,都需要维护来确保它能继续良好工作。

在 development 相关的记分卡上,他说,总体而言,社区做得很好了。针对嵌入式系统环境有了很多种 build 系统以及发行选项,有各种不同的公司提供培训和咨询,toolchain 的支持状态也很不错,调试选择也很丰富。

然而,有两个开发领域仍在进行之中。首先是测试覆盖面方面还是存在差距,特别是在自动测试和硬件测试方面。此外,虽然在支持更多硬件方面取得了巨大的进展,但来自 SoC 和其他供应商的许多代码实际上没有进入 upstream。这意味着生产嵌入式 Linux 设备的公司必须带有大量的 kernel tree 之外的 patch,从而增加了他们的技术负担。

关于 market 方面,他已经列出一个各种类型的嵌入式产品的清单,不保证全面。这表明 Linux 做得相当好。例如,沃尔玛和亚马逊正在使用运行 Linux 的无人机来进行无人机送货;很多商用无人机也运行 Linux。运行基于 Linux 的机器人操作系统(ROS)的机器人预计在 2024 年将占到商业机器人销售额的 55%。如今,汽车中的软件也主要基于 Linux。

让他感到惊讶的一个领域是 Linux 在太空中的应用。他预计这需要更长的时间,但 Linux 在这一领域的使用也在迅速提高。Starlink 和 SpaceX 使用 Linux,Ingenuity 直升机和一些 cubesats 卫星也是如此。他认为,随着更多的商业化硬件进入太空,Linux 也将随着它们一起进入。路由器、移动电话和消费电子产品都由 Linux 主导。事实上,在某些领域如电视和 DVR,Linux 几乎占据了 100%的市场份额。"在消费电子领域,我们完全是压倒性的。"

总体而言,嵌入式 Linux 社区 "做得非常好"。Linux 被广泛部署,达到了 "统治世界" 的水平。但它不会出现在所有的产品中,我们不会看到 Linux 运行在 cereal box 麦片包装盒上,也许永远不会。core kernel 拥有对嵌入式使用场景的支持,尽管总是需要新的驱动程序以及其他代码来支持新的硬件。

他总结说,这里的底线是:"我们还没有完成,但已经很不错了。" Linux 已经准备好用于很多不同种类的设备了。他希望他的旋风式介绍可以帮助与会者准备好设计和建造他们的后续产品,并帮助他们成为生态系统和社区中积极和有成效的成员。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值