LWN:维护者峰会上讨论Rust in kernel!
关注了就能看到更多这么棒的文章哦~
Using Rust for kernel development
By Jonathan Corbet
September 27, 2021
Maintainers summit
DeepL assisted translation
https://lwn.net/Articles/870555/
在 2021 年的 Linux Plumbers 大会上,Linux 的 Rust 开发者们进行了许多富有成效的讨论。在维护者峰会(the Maintainers Summit)上,Miguel Ojeda 继续谈论关于 Rust 的话题。要怎样才能让 Rust 补丁被合入 mainline?他得到的答案是很令人鼓舞的,尽管并不是完全的承诺。
Ojeda 首先问大家,社区是否希望 Rust 进入内核。他说,如果 Rust 进入内核,它就应该作为一等公民。在他的讨论中,他遇到了许多对该语言感兴趣的内核开发者,其中许多人愿意参与。在这个过程中,他已经得到了这些开发者中许多人的帮助。他说,一些团体,比如安卓团队,都很迫切地希望 kernel 拥有 Rust 支持。
Linus Torvalds 回答说,内核社区 "几乎肯定(almost certainly)" 会用该语言来进行试验,但 Rust 的开发者需要接受我们把它当作试验。在这之前,不需要说服内核社区里的每一个人,但确实需要先获得不少子系统维护者的支持,主要是那些在一开始就会受到直接影响的维护者。他说,来自 "fake Linus"(指的是 GPIO 维护者 Linus Walleij)和 Greg Kroah-Hartman 的支持就会是一个好的开始。并不是必须要获得大多数内核维护者的支持的。几个月前,当这些 patch 被发布出来时,Torvalds 曾看过这些 patch,其中没有什么东西会让他感到说 "完全无法接受"。不过从那以后,他就再也没有看到过任何后续的发布了。Torvalds 最后说,如果 Rust 支持不先被合入的话,它就永远不可能达到足够可以在内核中真正使用起来的程度。
Kroah-Hartman 说,Rust 的补丁看起来比以前好多了,但还没有完全准备好。Wedson Almeida Filho 在 7 月份发布的 Rust GPIO 驱动是 "非常棒的",他还说一些文件系统开发者对 Rust 很感兴趣。这可能是一个很好的开展工作的场所,因为内核中的虚拟文件系统 API 相对稳定。
Kees Cook 建议,WiFi 或蓝牙驱动可能是一个使用 Rust 的好地方。Kroah-Hartman 回答说,他很愿意抛弃目前所有的蓝牙驱动。他说,他知道有一款即将上市的手机将会配备 100 个 out-of-tree 的驱动程序,他建议那些对 Rust 感兴趣的开发者可以从这些驱动中挑选 10 个,看看是否能开展工作。
Dave Airlie 说,肯定会有一些维护者因为增加了一种新的语言而感到害怕。他们将不得不花时间通过编写一些有用的代码来学习这个语言。他们需要确保外界有一些人会帮助他们来处理他们的子系统中的 Rust 代码。Torvalds 说,Rust 并不难懂,尽管错误处理的模式跟 C 很不一样。任何有能力 review patch 的人应该都可以掌握 Rust 语言到足够 review 该语言代码的程度。
Ted Ts'o 建议,Rust 的开发者应该更有规律地来发布 patch,比如每隔一两个星期发布一次。当有东西出现在他们的收件箱里时,开发者会看一看,这就是引起他们注意的方法。
Airlie 说,现在在内核的边边角角的位置有了一些 Rust 代码例子,比如说驱动程序领域。那有没有把 Rust 放到内核的核心领域的代码,而在边角来使用 C 代码的例子?Ojeda 回答说,Rust 的开发者并不是要重写核心内核中的功能,相反,他们正在做一套抽象层,从而可以便于利用安全的 Rust 语言来编写驱动程序。他说,如果使用 Rust 编写核心部分、而用 C 语言来写驱动的话,就会失去使用 Rust 的很多优势了。一旦你使用了 Rust,你就会想保持使用 Rust。
Ts'o 提出了经常有人担忧的对于那些范围比较广的、跨子系统的改动。当涉及到 Rust 代码时,这些改动会有多困难?如果 GPIO 的维护者同意的话,那就没问题,因为这个子系统基本没有什么其他依赖和影响。但是,如果文件系统开发者不得不修改一处代码从而破坏了 Rust 的 GPIO 接口,那会出现什么情况?Ojeda 重申,内核维护者需要接受这种变化,并且他们需要准备好 review 那些对他们的子系统的改动。来自其他子系统的开发者如果想在使用 Rust 的子系统中进行修改,就得先学习这种语言。Rust 开发者可以提供帮助,但这是不够的。如果内核维护者想要 Rust,他们就得要帮忙。Mark Brown 说,即使维护者有这个动力去进行 review,Rust 开发者的 review 也还是必要的,这样才能确保这个 patch 是 "符合 Rust 品位的"。毕竟,他一周前才开始学习这门语言,现在还不搞不清楚自己的写法对不对。
Arnd Bergmann 说,把 Rust 代码放到 kernel tree 的某些角落里,并不是正确的做法。在目前的 patch 中,有一个顶层的 Rust 目录,但是把 Rust 代码分放在相关的各个子系统中会好得多。应该把尽可能少的代码放在那个统一位置。Ojeda 回答说,还是需要有一些通用的支持代码,但很多东西可以从目前的内核 Rust 目录中分离出来,放到相关的子系统里面去。
Al Viro 询问 Rust 工具链是否足够稳定,他指出,目前要求使用最新的 Rust 编译器,这是一个问题。通常每个月至少会有一次他需要对过去三四年历史的 git commit 中进行 bisect 二分法查找来确认引入问题的那个 commit。如果在 bisect 中每个步骤都需要用不同的编译器,那么用起来就很麻烦了。Ojeda 说,现在的内核工作还正在使用一些不稳定的 Rust 特性,这确实是一个问题,兼容性不够好。目前的 Rust patch 可以使用一个 Rust 版本来完成对每个 kernel release 的编译,但是他们不能保证以后更新过的编译器还能正常编译过。所以,是的,bisect 的时候确实可能需要改变编译器的版本。
然而,如果 Rust 支持进入 mainline kernel,那么情况就会改变。这将给 Rust 开发社区带来压力,使其稳定 Rust 语言中所需要的那些功能,尽管没有人能保证这一定会发生。不过迟早会建立起一个只使用稳定的 Rust 特性的内核,到那时兼容性问题就会消失。他说,如果社区选择在这之前不合并对 Rust 支持,那他也能理解。
Ts'o 说,如果 Rust 社区想要从加入 Linux kernel 中引出的这些公共关系中尝到甜头,那么 Rust 社区可能也会被感动,从而来对这些必需的功能保持足够稳定。Ojeda 说,他被邀请参加今年的 Rustconf,这是一个好兆头,但随后他提交的关于 Rust 在内核中使用情况的材料被拒绝了,这就不是一个好兆头了。不过,后来在那次会议上还是强调了 Rust 加入 Linux kernel 的一些需要考虑的问题,所以在某种程度上来说,Rust 社区肯定是有兴趣的。
Thomas Gleixner 说,他并不反对这个实验,而且他喜欢这个语言中的一些概念。但他担心的是 "Rust 中未支持的 memory-model 应该怎么处理"。Ojeda 说,Rust 社区正在从 C++11 和 C11 标准中了解内存模型(memory-model)相关的信息,但还没有最终确定。Ojeda 说,在本周早些时候的一次谈话中,他鼓励 Paul McKenney,认为现在是去 Rust 社区并告诉他们后续事情会如何发展的最好时机,这是一个修复 C 语言 memory model 问题并采用正确方式实现的好机会。
Torvalds 在会议结束时重申,将 Rust 引入内核算是一个实验,社区只是把它的脚趾头放入水中而已。它会需要好几年的时间来把事情弄清楚,并确定它在内核中是否真的有帮助。他对 Rust 持积极态度,喜欢这种语言,也希望有一种更安全的语言,特别是用于那些驱动开发场景。但是,他在最后告诫说,他并不期望用 Rust 语言来重写整个内核。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~