出品 | 51CTO技术栈(微信号:blog51cto)
又过去一年,Linus 的 Rust for Linux项目进展如何了?情况不太好。
试图将 Rust 代码添加到 Linux 内核的开发人员,仍在继续面临来自内核维护者的反对,这些维护者认为:使用多种语言是一种不受欢迎且风险较高的复杂情况。
去年 9 月,当微软软件工程师韦德森·阿尔梅达·菲略(Wedson Almeida Filho)因对“非技术性胡闹”感到沮丧而退出 Rust for Linux 项目时,问题首次浮出水面。
内核维护者的煎熬
“别强迫我应付你当下流行的时髦语言。维护多语言项目是件痛苦的事。”
上个月,当提出一个抽象方案以允许用 Rust 编写的设备驱动程序调用主要基于 C 的内核核心 DMA API 时,问题再次引发争议,内核维护者克里斯托夫·赫尔维格(Christoph Hellwig)对此表示反对。
具体来说,提交了一个补丁,允许 Rust 驱动程序使用 DMA API 的 dma_alloc_coherent() C 函数来分配和映射用于直接内存访问的大内存区域。
在给 Linux 内核邮件列表的一封信中,赫尔维格写道:“请不要在 kernel/dma 中使用 Rust 代码。” 值得一提的是,该补丁将代码添加到了 Linux 源代码树的 rust/kernel 部分,而不是 kernel/dma,至少据我们所知是这样。
Rust for Linux 项目的米格尔·奥赫达(Miguel Ojeda)请求赫尔维格提出替代方案。
赫尔维格回应道:“把包装器留在你的代码里,而不是让别人的日子变得痛苦。”他还接着愤愤不平地说,“DMA API 的接口应该保留在可读的 C 代码中,而不是用奇怪的绑定,这样它才能保持可查找性和可维护性。”
赫尔维格似乎希望非 C 驱动程序有自己的私有 C 代码绑定,并且这些抽象不应该单独维护,即使在 rust/kernel 树中也不行。
红帽软件工程师丹尼洛·克鲁姆里奇(Danilo Krummrich)参与了 Rust for Linux 项目,他质疑赫尔维格,赫尔维格明确表示他根本不想处理 Rust 代码。
“别强迫我应付你当下流行的时髦语言,”他写道,“维护多语言项目是我不愿处理的痛苦。如果你想用非 C 语言,无论是汇编还是 Rust,你写到 C 接口,并且自己处理阻抗不匹配的问题,就我而言。”
对此,克鲁姆里奇解释说,Rust for Linux 项目正在创建抽象 C API 的 Rust 代码,供所有 Rust 驱动程序使用,并由 Rust 开发者维护。换句话说,内核的 C 端保持不变,Rust 驱动程序使用对 C 代码的抽象,并且这些抽象由 rust/kernel 中的团队集中维护,这可以说比驱动程序各自拥有独立的 C 绑定要好得多。
混合C和Rust是一种癌症
但赫尔维格似乎对单独维护 DMA Rust 抽象层并不感兴趣。他解释说,他不想要另一个维护者:
如果你想因为跨语言代码库而使 Linux 难以维护,那就去做吧,这样你必须自己处理,而不是将这种“癌症”扩散到核心子系统。(这里的“癌症”明确指的是跨语言代码库,而不是 Rust 本身,只是为了避开那些喜欢煽风点火的人)。
熟悉技术历史的人可能会记得,2001 年,时任微软首席执行官的史蒂夫·鲍尔默(Steve Ballmer)曾将 Linux 比作癌症。“Linux 是一种癌症,它从知识产权的角度附着在它接触到的一切事物上,”鲍尔默说,那时 Linux 还没有扩散到 Windows 子系统 for Linux。
赫尔维格接着争辩说,让其他人维护 DMA 内存分配器的 Rust 抽象层作为一个单独的组件并不能改善情况,反而会阻碍内核的可维护性:
每一种额外的语言渗入,都会极大地降低内核作为一个集成项目的可维护性。Linux 能够存活这么久的唯一原因是它没有内部边界,而添加另一种语言则完全打破了这一点。你可能不喜欢我的回答,但我将尽我所能阻止这种情况。这不是因为我讨厌 Rust。尽管它不是我最喜欢的编程语言,但它肯定是最好的新语言之一,我鼓励人们在适合的项目中使用它。我绝对不希望它出现在我需要维护的巨大 C 代码库附近。
Ashai Linux 项目负责人赫克托·马丁(Hector Martin)表示,他认为赫尔维格的言论构成了违反行为准则的行为,但他怀疑不会采取任何纪律处分。《注册报》询问马丁是否打算提交行为准则投诉,但我们尚未收到回复。
Linus的态度决定Rust for Linux项目的存亡
马丁认为,Rust for Linux 的开发人员应该忽视赫尔维格的担忧,并提交他们的补丁以供内核负责人林纳斯·托瓦尔兹(Linus Torvalds)批准:
“如果林纳斯没有在这个话题上给出权威性的答案,米格尔和其他 Rust 人员应该在补丁经过审查并准备好后直接合并这个系列,忽略克里斯托夫试图破坏项目的明显企图。如果林纳斯[接受拉取请求],克里斯托夫说什么都不重要。如果林纳斯不[接受],[Rust for Linux]项目基本上就死了,除非林纳斯或克里斯托夫采取行动。其他一切都是在兜圈子。”
有外媒曾询问赫尔维格是否愿意就上面马丁的评论发表意见,他拒绝了。
支持Rust的理由
2022 年 10 月 3 日,Linux 内核增加了对 Rust 代码的支持,此前不久,微软 Azure 首席技术官马克·鲁西诺维奇(Mark Russinovich)曾主张新的编程项目应该用 Rust 而不是 C 或 C++ 来编写。
“为了安全性和可靠性,行业应该宣布这些语言已经过时,”鲁西诺维奇说。
他的理由是,Rust 代码可以编写得避免困扰 C 和 C++ 代码的内存安全漏洞(例如缓冲区溢出),这些漏洞是大型项目中大多数严重漏洞的根源。这种观点随后得到了世界各地政府安全机构的支持。
Linus:有些人不希望 Rust 侵入他们的领域
那些编写 C 和 C++ 代码的人注意到了对 Rust 日益增长的兴趣,并承认需要解决内存安全问题。因此,有许多项目正在进行中,例如 TrapC、FilC、Mini - C 和 Safe C++,旨在使 C 和 C++ 更不容易受到内存漏洞的影响,此外还有像 DARPA 的 TRACTOR 这样的努力,以自动将 C 代码转换为 Rust。
在菲略去年宣布退出 Rust for Linux 之后不久,Linux 领袖林纳斯·托瓦尔兹(Linus)在奥地利维也纳的 Linux 基金会开源峰会上,就 C 和 Rust 开发者之间的摩擦发表了看法。
“显然,有些人就是不喜欢 Rust 的概念,也不希望 Rust 侵入他们的领域,”托瓦尔兹说,“甚至有人在谈论 Rust 集成是一个失败……我们已经做了两年了,现在就说这个还为时过早,但我认为,即使它最终成为一个失败——而我不认为它会——这也是学习的过程。”
到目前为止,Linux 开发者社区已经了解到 Rust 并不总是受欢迎的。
刚刚!马丁请求辞去Linux内核维护者的职务
最新消息,本周五(2月7日发搞当天),赫克托·马丁已请求辞去 Linux 维护者的职务。
图片
“我对内核开发流程或社区管理方式已经没有任何信心了,”他在给 Linux 内核邮件列表的信中写道。
“苹果/ARM 平台的开发将继续在下游进行。如果我以后自己想为任何子树提交一些补丁到上游,我可能会,也可能不会。任何愿意自己为上游提交而战的人都可以这么做。”
参考链接:https://www.theregister.com/2025/02/05/mixing_rust_and_c_linux/?td=rt-3a