Linux 内核维护者:将 Rust 和 C 混合使用如同“癌症”

360影视 2025-02-08 15:51 3

摘要:去年 9 月,当 Microsoft 软件工程师 Wedson Almeida Filho 因为对"非技术性的无聊事务"感到不满而退出 Rust for Linux 项目时,这种担忧就已经浮出水面。这种"非技术性的无聊事务"可以理解为与持不同目标者合作的困难。

开发者试图将 Rust 代码添加到 Linux 内核时,持续面临来自内核维护者的反对。这些维护者认为使用多种编程语言是一种不受欢迎且具有风险的复杂做法。

去年 9 月,当 Microsoft 软件工程师 Wedson Almeida Filho 因为对"非技术性的无聊事务"感到不满而退出 Rust for Linux 项目时,这种担忧就已经浮出水面。这种"非技术性的无聊事务"可以理解为与持不同目标者合作的困难。

上个月,当一个允许用 Rust 编写的设备驱动程序调用主要基于 C 语言的内核核心 DMA API 的抽象提案遭到内核维护者 Christoph Hellwig 的反对时,这个问题再次激化。

具体来说,有人提交了一个补丁,允许 Rust 驱动程序使用 DMA API 的 dma_alloc_coherent C 函数来分配和映射大内存区域,以供硬件进行直接内存访问。

Hellwig 在 Linux 内核邮件列表中写道:"请不要在 kernel/dma 中放置 Rust 代码。"尽管据我们所知,该补丁是将代码添加到 Linux 源代码树的 rust/kernel 部分,而不是 kernel/dma。

Rust for Linux 项目的 Miguel Ojeda 请 Hellwig 提出替代方案。

Hellwig 回复说:"将包装器保留在你们自己的代码中,而不是让别人的生活变得痛苦。"他进一步论述说,"DMA API 的接口应该保持在可读的 C 代码中,而不是奇怪的绑定中,这样它才能保持可搜索和可维护性。"

当被参与 Rust for Linux 项目的 Red Hat 软件工程师 Danilo Krummrich 质疑时,Hellwig 明确表示他就是不愿意处理 Rust 代码。

"不要强迫我处理你们的新潮语言,"他写道。"维护多语言项目是一件令人头疼的事,我不想处理。如果你想使用 C 以外的语言,无论是汇编还是 Rust,你都要编写 C 接口,并自己处理不匹配的问题。"

作为回应,Krummrich 解释说,Rust for Linux 工作组正在创建抽象 C API 的 Rust 代码,供所有 Rust 驱动程序使用,并由 Rust 开发者维护。换句话说,C 端保持不变,Rust 驱动程序使用对 C 代码的抽象,这些抽象由 rust/kernel 中的团队维护,这比让驱动程序拥有各自的 C 绑定要好。

但 Hellwig 似乎对单独维护 DMA Rust 抽象不感兴趣。他解释说他不想要另一个维护者:

"如果你想通过跨语言代码库使 Linux 变得无法维护,那就在你的驱动程序中这样做,这样你就必须自己处理,而不是将这种癌症扩散到核心子系统。(这里的癌症明确指的是跨语言代码库,而不是 Rust 本身,以避免引发争议。)"

技术史研究者可能记得,2001 年时任 Microsoft CEO 的 Steve Ballmer 也将 Linux 比作癌症。"Linux 是一种癌症,从知识产权的角度来说,它会附着在它接触的一切事物上,"Ballmer 说道,那时的 Linux 还没有演变成 Windows Subsystem for Linux。

Hellwig 继续论述说,让其他人将 DMA 一致性分配器的 Rust 抽象层作为单独的组件来维护并不能改善情况,反而会阻碍内核的可维护性:

"每增加一点其他语言的渗入都会大大降低内核作为一个整体项目的可维护性。Linux 之所以能存活这么久,唯一的原因是没有内部边界,而添加另一种语言完全打破了这一点。你可能不喜欢我的答案,但我会尽我所能阻止这种情况。这不是因为我讨厌 Rust。虽然它不是我最喜欢的语言,但它绝对是最好的新语言之一,我鼓励人们在合适的新项目中使用它。我不希望它出现在我需要维护的庞大 C 代码库附近。"

Ashai Linux 项目负责人 Hector Martin 表示,他认为 Hellwig 的言论违反了行为准则,但他怀疑是否会采取任何纪律处分。

Martin 认为 Rust for Linux 开发者应该忽略 Hellwig 的担忧,直接向内核负责人 Linus Torvalds 提交补丁请求批准:

"如果 Linus 不对这个讨论线程做出权威回应,Miguel 和其他 Rust 开发者应该在补丁经过审查并准备就绪后直接合并它,忽略 Christoph 公然破坏项目的企图。如果 Linus 接受这个 pull request,那么 Christoph 说什么都无关紧要。如果 Linus 不接受,那么 Rust for Linux 项目实际上就陷入停滞,直到 Linus 或 Christoph 采取行动。其他一切都是在绕圈子。"

为什么选择 Rust

Linux 内核于 2022 年 10 月 3 日添加了对 Rust 代码的支持,此前不久 Microsoft Azure CTO Mark Russinovich 曾主张新的编程项目应该使用 Rust 而不是 C 或 C++。

"为了安全和可靠性,业界应该宣布这些语言已经过时,"Russinovich 说。

他的理由是,Rust 代码可以编写得避免内存安全漏洞(如缓冲区溢出),这些漏洞困扰着 C 和 C++ 代码,并构成了大型项目中大多数严重漏洞。这一观点已经得到了世界各地政府安全组织的支持。

那些编写 C 和 C++ 代码的人已经注意到了对 Rust 日益增长的兴趣,并承认需要解决内存安全问题。因此,除了像 DARPA 的 TRACTOR 这样将 C 代码自动转换为 Rust 的项目外,还有许多项目正在进行中,如 TrapC、FilC、Mini-C 和 Safe C++,旨在使 C 和 C++ 更不容易受到内存漏洞的影响。

在 Filho 去年宣布退出 Rust for Linux 后不久,Linux 掌门人 Linus Torvalds 在维也纳 Linux 基金会开源峰会上谈到了 C 和 Rust 开发者之间的摩擦。

"很明显,有些人就是不喜欢 Rust 的概念,也不喜欢 Rust 侵入他们的领域,"Torvalds 说。"人们甚至在谈论 Rust 集成是一个失败...我们做这件事才几年,现在说这些还为时过早,但我也认为,即使它最终成为一个失败 —— 我不认为会失败 —— 这也是学习的方式。"

到目前为止,Linux 开发者社区已经认识到 Rust 并不总是受欢迎的。

来源:至顶网

相关推荐