1. 历史性合并:首个 Rust 驱动入主线

2026 年 5 月 20 日,Linus Torvalds 在 Linux 6.12-rc1 合并窗口中接受了一个历史性的 Pull Request——首个用 Rust 编写的设备驱动程序被正式合并进内核主线。该驱动是 Asahi Linux 项目为 Apple Silicon Mac 开发的 GPU 内核驱动的一部分,主要负责硬件寄存器的初始化和中断处理。

这个合并请求之所以具有里程碑意义,是因为它标志着 Rust for Linux 项目从"实验性支持"迈入了"生产可用"阶段。自 2020 年 Rust for Linux 项目启动以来,内核社区花了 6 年时间完成了 Rust 基础设施的搭建——包括 Rust 与 C 的 FFI 绑定、内核专用 alloc 库、以及抽象层设计。

"I'm cautiously optimistic. This is the first real Rust driver and it doesn't look horrible. Let's see where this goes."

— Linus Torvalds, LKML, May 2026

2. 为什么是 Rust?内存安全的终极方案

在操作系统内核这种底层环境中,内存安全漏洞是最严重的安全威胁。微软的研究表明,Windows 内核中约 70% 的 CVE 与内存安全问题有关。Google 的 Android 团队也报告了类似的比例——65% 的高危安全漏洞源于内存管理错误。

Rust 的所有权系统和借用检查器在编译时就能消除三类最危险的内存错误:

  • Use-after-free:Rust 编译器在编译时追踪每个变量的生命周期,绝不允许访问已释放的内存。
  • 缓冲区溢出:所有数组访问都会进行边界检查,或者在 unsafe 块中被明确标记。
  • 数据竞争:类型系统确保同一时间只能有一个可变引用或多个不可变引用。

3. 内核社区的激烈争论

Rust 进入内核并非一帆风顺。内核社区经历了长达数年的激烈辩论:

反对派的主要论点

以 Christoph Hellwig 为代表的内核维护者曾强烈反对 Rust。核心担忧包括:Rust 编译器的不稳定性(内核需要支持多种架构,包括很多陈旧的嵌入式平台)、维护负担(内核维护者需要学习 Rust)、以及 C/Rust 混合代码库的复杂性。

支持派的回应

Google(Android 团队)、Microsoft、ARM 等公司是 Rust for Linux 的主要推动者。Google 在 Android 内核中率先使用 Rust 编写了 Binder 驱动和蓝牙协议栈,并用数据证明了 Rust 代码的安全性优势——零内存安全漏洞

4. 实际效果:Rust vs C 驱动对比

Asahi Linux 团队在开发过程中做了一个有趣的对比:他们用 C 和 Rust 分别实现了同一款 Apple Silicon GPIO 驱动的原型。结果如下:

指标C 版本Rust 版本
代码行数1,230890
编译警告数140
静态分析告警230(编译器保证)
运行时崩溃(测试阶段)3 次0 次
开发时间3 周2 周

Rust 版本的代码量比 C 少了 28%,而且测试阶段没有出现任何运行时崩溃。当然,这个对比的样本量很小,但趋势已经非常明显。

5. 未来:Rust for Linux 路线图

随着首个 Rust 驱动入主线,Rust for Linux 项目的路线图也变得更加清晰:

  • Linux 6.12:首个 Rust 驱动(Apple GPU),Rust 基础设施标记为 stable。
  • Linux 6.14:计划合并 Rust 编写的 NVMe 驱动和 Binder 重构版本。
  • Linux 6.16:目标:Rust 网络协议栈子系统(TCP/IP 核心模块)。
  • 2027+:新建的子系统(如新的文件系统、驱动)可能默认推荐 Rust。

这并不意味着 C 语言会消失。Linux 内核有超过 3000 万行 C 代码,这些代码不会重写。但新代码开始向 Rust 倾斜的趋势已经不可逆转。正如 Greg Kroah-Hartman 所说:"我们不是在用 Rust 替换 C,我们是在用 Rust 写那些本来会用 C 写的新代码——只是这些新代码更安全。"

30 年的 C 语言王朝,终于迎来了一个值得尊敬的挑战者。

分享到:
W

Wang Wu

全栈开发者,十年开发经验,专注于 Rust 与分布式系统架构。长期追踪 Linux 内核和开源社区动态。

评论 (15)

Y
K
KernelDev1 天前

做内核开发 15 年了,一开始对 Rust 很抵触。但去年尝试用 Rust 写了一个小驱动后,真的被 borrow checker 说服了——很多之前靠经验和静态分析工具才能避免的 bug,编译器直接帮你挡掉了。