“Rust 进入内核是有真正的技术原因的,比如内存安全。这就是为什么 Rust 很适合用于内核开发。”两年前,Linux 创始人 Linus Torvalds 道出了他的看法,并表示下一个版本将能看到 Rust 基础设施,也就是在 2022 年 11 月前后。
但是随着 Linux 6.0 版本的到来,并没有出现支持 Rust 的代码。
“实际上,我希望我们能够获得一些首批 Rust 基础设施和多代 LRU VM,但这次它们都没有实现。”他沉思后道:“总会有更多的版本发布。”
进展缓慢。直到 2024 年 3 月初,Rust 编写的驱动程序才首次进入 Linux 主线。
在今年 8 月香港开源峰会上,Linus 的失望溢于言表:“Linux 内核中的 Rust 采用速度太慢了,我原以为更新会更快一些。”
在这场内存安全竞赛中, Linux 与 Windows、Android 曾经站在同一起跑线。而现在,它似乎已经落后了。
安全漏洞频发,矛头直指 C/C++
2019 年 2 月,在 BlueHat 以色列安全会议上,微软安全工程师 Matt Miller 的一篇报告《Trends, challenges, and strategic shifts in the software vulnerability mitigation landscape》引起了业内的广泛关注。他提到,在过去 12 年里,微软每年发布的补丁中约有 70% 都是针对内存安全漏洞的修补。
这都是因为 Windows 主要用 C 和 C++ 编写。它们都是“内存不安全”的编程语言,提供了直接访问内存的能力。这种能力虽然强大,但同时也增加了安全风险,因为开发人员在编写代码时一不小心,就可能制造出能够被利用的安全漏洞。正如 Matt Miller 所指出的,大多数漏洞正是开发人员在编写 C 和 C++ 代码时,无意中引入了会导致内存损坏的错误而造成的。
![]()
解决这个难题的方式就是,从 C / C++ 编程语言转向所谓的“内存安全语言”。这类语言,从设计之初就内置了针对内存损坏漏洞的防护措施,包括预防缓冲区溢出、竞争条件、内存泄漏、使用后释放以及与内存指针相关的错误。
而 Rust,被微软视为 C/C++ 的最佳替代品。Linux 内核面临的问题也一样,因为其主要编程语言也是 C 语言。
事实上,除了 Rust 之外,还有C#、 F#、.NET 、Swift、Go 和 Python 等多个被公认的内存安全语言,并且被广泛使用。但真要认真比较起来,Rust 在某些方面还是要更胜一筹。比如 C# 虽然也属于内存安全的语言,但不如 Rust 在系统编程领域的内存安全模型那样先进;Go 某些功能缺失,影响编写高可靠性代码,而且在多个线程的情况下,其内存安全存疑。
总而言之,能够实现内存安全性还兼具 C / C++ 的高性能和高并发的,只有Rust。
Rust 与 C/C++ 一样,具有最小且可选的“运行时”。Rust 的标准库(stdlib)非常小,依赖于libc。这意味着,Rust 可以在没有完整操作系统支持的环境中运行,例如嵌入式系统或裸机编程。此外,Rust 编译为原生机器代码,性能接近 C/C++,且编译器优化能产出高效代码,与手动优化过的 C 和 C++ 代码相媲美。
因此,当从代码执行的速度、开发者对程序行为的控制能力以及程序性能的可预测性这三个方面来看,Rust 的性能表现与 C 和 C++ 相似。
这并不意外,Rust 本来就是为替代 C 及 C++ 而诞生的。
创始人 Graydon Hoare 创造 Rust 的灵感,就是来源于电梯故障——电梯等设备内部的软件通常都是用C或C++编写的,好处在于运行速度快,但也很容易意外引入内存错误,造成程序崩溃。
Graydon Hoare 曾直言,Rust 的目标用户,就是“对C++感到沮丧的开发者”——包括他自己。
So if you are in a similar situation we're in, repeatedly finding yourself forced to pick C++ for systems-level work due to its performance and deployment characteristics, but would like something safer and less painful, we hope we can provide that.
如果你和我们处于类似的情况,发现自己不得不因为性能和部署特性而反复选择 C++ 进行系统级工作,但又希望有更安全、痛苦更少的选择,我们希望我们能为你提供这样的解决方案。
因此,要论谁是最适合操作系统的编程语言,Rust 当仁不让。
与 C/C++ 相比,Rust 确实是一个较新的编程语言,资历尚浅。Rust 首次发布是在 2010 年,而 C 语言最早可以追溯到 1972 年,C++ 则是在 1983 年。
也正是因为出现得晚,众多编程语言的优缺点才能充分展现出来,这使得 Rust 的创造者 Graydon Hoare 能够在前人基础上,将这许多优点集于一体,从而创造出了 Rust。
一个实验性项目:Rust for Linux
四年前, 一个致力于将 Rust 语言引入 Linux 内核的项目——Rust for Linux (RFL)启动了。这一项目获得了微软和谷歌等行业巨头的支持,甚至连 Linux 创始人 Linus Torvalds 也认为其值得一试。他们分别代表了三大操作系统:Windows、Android,以及 Linux。
这是一个实验性质的项目,起初,各方都是抱着谨慎试水的心态。
微软率先在 2019 年展开行动,开始尝试使用 Rust 重写原本用 C 和 C++ 编写的 Hyper-V 驱动程序,希望减少 Windows 中的内存安全漏洞。 这一行动标志着,对 Rust 语言在操作系统级别应用的探索开始了。
谷歌在 2021 年 4 月开始在 Linux 内核中推动使用 Rust。不过,其目标并不是用 Rust 替换内核中的 C 代码。“Linux 内核有超过 3000 万行代码,因此我们的目标自然不是将其全部转换为 Rust,而是允许用 Rust 编写新代码。”
Linus 也是抱着观望的态度。
我们拭目以待。我不认为 Rust 会接管核心内核,但在其中开发单个驱动程序(甚至可能是整个驱动程序子系统)听起来并非完全不可能。也许文件系统也是如此。因此,这并不是“取代 C”,而是“在有意义的地方增强我们的 C 代码”。
当然,驱动程序大约占实际内核代码的一半,因此有很大的空间。但我不认为有人真的期望用 Rust 全面重写现有的驱动程序,更多的是“有些人会用 Rust 做新的驱动程序,并且一些驱动程序可能会在有意义的地方被重写”。
![]()
据 Linus 透露,这几年里,大部分时间都在建立 Rust 基础设施——支持 Rust 代码在内核中运行和集成的工具、库、以及必要的抽象层。
我们在去年合并了 Rust 初始基础设施,它一直在不断增长,但是内核还没有真正依赖它的部分。
目前 Rust 并没有真正释放出它的能力,但是我认为明年(2024)我们实际上会开始会积极使用 Rust 来集成驱动程序甚至一些主要的子系统(Major Subsystems),所以这需要数年时间的积累才能让 Rust 成为内核的重要组成部分,Rust 肯定会成为其中之一。
由于在 Linux 内核中尚未明显看到 Rust 的成效,这项工作遭到了反对者的质疑,被贬低为“玩具项目”,用 Rust 开发内核,不过在浪费时间而已。
项目遭遇的阻力颇多,进展缓慢。Linus 也一改此前对 Rust 试探的态度,而是变得更加急切,在今年 8 月在香港举行的 CubeCon 大会表达了他的失望。
Linux 内核中的 Rust 采用速度太慢了,我原以为更新会更快一些,但部分问题在于,资深内核开发者习惯了使用C语言,并不熟悉Rust。他们对于不得不学习一门在某些方面差异很大的新语言,并没有太大的热情。因此,对于Rust的使用,确实存在一些抵触情绪。
RFL 受阻,跟 Rust 关系不大
与 RFL 的境况不一样的是,微软和谷歌在引入Rust 这件事上尝到甜头后,要更加激进。不仅向 Rust 基金会捐赠 100 万美元表示支持,连自家的操作系统也在加速拥抱 Rust。
微软在 Windows 11 中推出基于 Rust 的内核实现,其中包括可以创建矩形、多边形和椭圆的 GDI Regions 功能。
在去年的 BlueHat IL 2023会议上,微软操作系统安全副总裁 David Weston 曾透露,内核已经增加了3.6万行代码,在测试环境下没有出现重大的性能退步,Win32k的GDI(图形驱动接口)移植到Rust后,在Windows上启动时能够通过所有测试。
![]()
今年初,微软 Azure 寻求 Rust 开发人员重写核心 C# 代码。微软 Azure 首席技术官 Mark Russinovich 此前就曾宣布,新软件项目应该使用 Rust,而不是 C/C++。
至于谷歌,早已在 Android 和其他产品中广泛使用 Rust 编程语言,并且正在尝试脱离 C/C++,将新代码的开发转移到内存安全的语言。
在 Android 13 中,大约 21% 的新原生代码 (C/C++/Rust) 都是用 Rust 编写的。AOSP 中的新功能和组件(例如 Keystore2、新的超宽带 (UWB) 堆栈、DNS-over-HTTP3、Android 的虚拟化框架 (AVF) 以及各种其他组件及其开源依赖项)中总共约有 150 万行 Rust 代码。这些是需要系统语言的低级组件,否则这些语言将用 C++ 实现。
在 Android 12 中,Android 平台支持 Rust 编程语言,作为 C/C++ 的内存安全替代方案。从那时起,谷歌一直在 Android 开源项目 (AOSP) 中扩大我们的 Rust 体验和使用范围。
再回过头来看 Linux,似乎已经落后了不少。经过四年的努力,第一个用 Rust 编写的网络 PHY 驱动程序,才终于在今年 3 月初的 v6.8 版本中首次被纳入 Linux 主线。
要在一个稳定运转了 30 多年的 Linux 内核中引入一门新语言,这并不容易。在一个靠爱发电的开源社区,你不能强求他人去学习、使用一门新的语言,更何况 Rust 语言以学习曲线陡峭著称。
Linux 面临的,也不是单纯的技术问题,而是在一个较为稳定的内核维护者团队引入大量的新鲜血液。这是新团队与旧团队,新文化与旧文化之间冲突。
这种冲突无疑会动摇开发者的信念。最近,由于内核维护者群体中反对声音过多,RFL 的核心开发者、微软工程师 Wedson Almeida Filho 宣布退出该项目的维护者团队。
之所以决定退出项目,是因为在过去四年的工作当中,我发现自己的精力和热情已经被严重消磨,越来越抗拒回应那些跟技术无关的废话。所以这份任务,最好是留给那些仍然抱有这份热情的成员。
![]()
原本项目的代码审查进度就很慢,维护者的退出无疑会进一步拖慢项目进展。根据北京邮电大学李弘宇等人的研究,RFL的瓶颈主要体现在代码审查环节,而非代码开发本身。
代码审查(PR,即Pull Request)的速度随着时间的推移显著变慢,例如,2023 年 1 月至 2023 年 7 月之间的 PR 平均需要 280 小时才能审查,是 3 年前的 200 倍。这表明生成 RFL 代码的速度比使用(即审查并最终将 RFL 代码合并到上游内核中)的速度快得多。
如果这些冲突无法解决,随着内核开维护者年龄逐渐变大,因 Rust 集成到内核吸引的年轻开发者又迟迟无法融入社区,Wedson Almeida Filho 对于 Linux 将被取代的担忧或许很快就会到来。
我坚信内核开发的未来在于内存安全语言。我不是那种很有前瞻性的人,但如果 Linux 没法把这项优势内化己用,我担心其他内核终将像取代 Unix 那样冲击 Linux。
当前已经有使用 Rust 编写的类 Unix 操作系统——Redox,它被看作是Linux和BSD的潜在替代品。尽管该项目的规模还不足为惧,但其一直在找机会补位。
Rust 与 操作系统,谁决定谁的未来?
Rust 语言在众多项目中取得了成功,如 Mozilla 的浏览器采用 Rust 编写 CSS 引擎,亚马逊的云服务如Amazon S3、Amazon EC2 等也完全基于 Rust 构建,甚至连 Discord 的客户端和服务器端、Figma 的多人服务器都选择了 Rust 进行重写。
然而,在开源操作系统领域,Rust 的发展速度始终显得缓慢。为了改变这一现状,Rust 团队也正在努力推动其在操作系统领域的发展。
不久前,Rust 团队公布了 2024 年下半年的 26 个项目目标,其中 3 个被指定为 flagship 目标,代表预计将产生最广泛整体影响的目标。这些目标包括发布 2024 版本、提升异步 Rust 编程体验,以及推动 Rust for Linux 项目。
Rust for Linux 项目标志着 Linux 内核对 Rust 开发的实验性支持,这被认为是 Rust 的一个分水岭,表明 Rust 确实有能力开发各种低级系统应用。但目前相关支持工作还停留在实验性阶段,项目团队计划在 2024 年下半年努力扫清障碍,以便更好地融入 Linux 内核。
![]()
与此同时,FreeBSD 社区也在讨论是否将 Rust 语言纳入基础系统(base system),以改善系统的安全性和可维护性。尽管经历了两次讨论,但都没有最终的结论。FreeBSD 核心团队成员 Warner Losh 表示,FreeBSD 社区需要一些明显的成功案例才能考虑将 Rust 纳入基础系统。他指出,Rust 在 LLVM 中没有得到很好的开箱即用支持,这带来了许多后勤问题。
不过,Rust 的在操作系统领域不可替代性,已经在谷歌这里有了验证。迄今为止,Android 的 Rust 代码中尚未发现任何内存安全漏洞。谷歌甚至宣称,它是解决内存安全问题的最强大的工具之一。
我们并不指望这个数字永远保持为零,但考虑到两个 Android 版本中新 Rust 代码的数量,以及使用它的安全敏感组件,这是一个重大的成果。这表明 Rust 正在实现其预期目标,即阻止 Android 最常见的漏洞源。在 Android 的许多 C/C++ 组件(例如媒体、蓝牙、NFC 等)中,历史漏洞密度大于 1/kLOC(每千行代码 1 个漏洞)。根据这一历史漏洞密度,使用 Rust 很可能已经阻止了数百个漏洞进入生产环境。
因此,可能不是操作系统决定了 Rust 的未来,而是 Rust 在左右这些项目的未来。
为了脱离 C/C++ ,推动 Rust 语言在Android 中的应用以提高安全性、稳定性和质量,谷歌正在行动:在 Android 平台上增加Rust的使用,实现用户空间硬件抽象层(HAL)的 Rust 版本,在受信任的应用程序中支持Rust,将Android虚拟化框架中的虚拟机(VM)固件迁移至Rust编写,等等。
我们已经可以预见,在未来操作系统开发中,Rust 凭借内存安全特性和高性能,将成为关键语言之一。Rust 的帝国,才刚开始。
那么,在操作系统之外,Rust 也将取代 C/C++吗?有人就认为,Rust 适合写内核级别的代码,但并不是适合业务开发,因为它不够高效,不够灵活。
9月27日晚19:00,开源中国 OSChina 将邀请华为Rust 技术专家马全一、南京大学计算机科学与技术系助理研究员冯洋等人,做客【开源漫谈】直播间,深入探讨Rust在操作系统领域的崛起及其对C/C++的潜在替代趋势,并客观分析Rust在各个开发领域的适用性,以期为广大开发者提供更为全面的技术视角和思考。
立即扫码,预约直播:
![]()