LWN: Linux kernel 中的Rust!

2023年,Rust将成为Linux 内核第二官方语言吗? 日前,Linux 内核和 Rust on Linux 的主要开发者 Miguel Ojeda 向 Linux Kernel 邮件列表提交了一个新补丁 (v2),进一步推进了 Rust for Linux 的工作进展。邮件内容指出,新的补丁将为 Linux 内核增加对 Rust 作为第二语言的支持,并且对 Rust 的整体支持进行了多项改进。具体来说,Rust 代码现在已经依赖于稳定的 Rust 编译器而不是之前的 beta 版本状态。 阅读详情

关注了就能看到更多这么棒的文章哦~

The Rust for Linux project

By Jonathan Corbet
September 16, 2021
Kangrejos
DeepL assisted translation
https://lwn.net/Articles/869145/

首届 Rust for Linux 会议,又名 Kangrejos,于 9 月 13 日正式开始了。组织者 Miguel Ojeda 在开幕演讲上概述了为什么希望在内核中使用 Rust、这里有哪些挑战、以及目前的状况如何。讲座以及后续讨论很好地概述了推动这一倡议的原因,以及可能存在的一些症结。

Why Rust?

他说,今年是 Linux 内核诞生 30 周年,但同时也是 C 语言的第一个 ISO 标准诞生 30 周年。C语言历史悠久,也有很多负担,但它仍然深度参与着如今的开发工作、并且也是很有意思的。Ojeda 说,他正在与 C 语言委员会合作来改进该语言,但就算它能取得成果的话,这一过程也需要很长的时间。

ce16fedc00bd5e98fa07d62bde3b1cae.png

C 语言用于内核开发的原因很多。它速度快,便于编写底层代码,简单,而且很适合 Linux kernel 这个环境。但是有一个小问题,就是有一些通常被人们称为 "undefined behavior" 的行为。Rust 的优势在于它消除了这类 undefined behavior,至少在 "safe" 代码中是这样的。事实上,Rust 开发者所说的 "safe" 的意思,就是指它消除了这些未明确定义情况下的行为,而跟 "safety-critical" 这类术语完全没有关系。根据这个定义来说的话,C语言中的 abort() 调用就是 safe 的,即使最后的结果是杀掉了一个进程。Ojeda 为 C 语言提出了一个 "[ [safty] ]" 属性,希望用它来标记所有那些需要避免 undefined behavior 的函数(并让编译器来强制保证这一点),但该提议没有取得多少进展。

那么按照 Rust 的标准,什么是不 "safe" 的呢?not-safe 行为的清单包括:在指针被释放后使用指针、访问 NULL 指针、两次释放一块内存、使用未初始化内存中的内容、内存访问越界、数据竞态行为(data race)等等。他断言,这些事情在 Rust 代码的 safe 部分都不会发生。这就是为什么他希望在内核中能使用 Rust 代码。他说,大约 70% 的 C 语言漏洞是由这些 undefined behavior 而导致的,而安卓多媒体和蓝牙组件中的漏洞中接近 90% 都是这类问题。Rust 就可以帮得上忙了。Rust 还提供了许多其他优势,包括更严格的 type 类型、module 模块、模式匹配原语、lifetime、一套完整的开发工具等等。

在内核中使用 Rust 的坏处是什么?他说,不可能对所有的东西都完成建模,所以还是有必要使用一些不安全的代码的。Rust 语言比 C 语言要复杂得多,其额外的 run-time check 会导致性能损失。当然,对于内核开发者和维护者来说,这又是一种需要学习的语言,这也是一个很大的成本。他说这是一个一次性的成本,会有很多回报,但这仍然得是要花精力的。Rust for Linux 的开发者们很乐意帮助开发者们来克服这个最初的学习障碍。

那么,作为一种系统编程语言,Rust 与 C 相比起来怎么样?和 C 语言一样,它的速度很快。它和 C 语言一样可以开发底层代码,但根据具体代码的情况可能有些不一样,开发者也许对有些代码不容易预测其所产生的汇编代码是什么样子的。Rust 绝对不像 C 那么简单。他认为,Rust 和 C 一样都适合这个领域,但其他人可能会有其他看法。

Rust support in the kernel

到目前为止,Rust 支持了五个体系架构:armv6、arm64、powerpc、riscv 和 x86-64。目前为止做这些工作的目的并不是要去支持所有架构,那会带来很多底层工作,而不一定能带来什么新的好处。相反,我们的目的是要证明 Rust 是可以支持各种架构的。目前有三个项目正在为内核编译 Rust 代码。其中两个使用了 "官方" 的 rustc 前端,然后使用 LLVM 或 GCC 来生成代码。rustc/LLVM 的组合是目前领先的 Rust 编译器方案。Ojeda 没有对 rustc/GCC 的搭配介绍。第三个项目正在为 GCC 开发 native Rust 编译器(gccrs),预计将在一两年内完成。

Rust for Linux 的工作分为 Rust 和内核两部分代码 tree。Rust 这一边有两个 crates,分别是 core(底层功能)和 alloc(数据结构等)。alloc crate 也是之前试图提交到内核里面的一部分代码,最终可能并不需要。这些 crate 被认为是 Rust 库的一部分,而不是内核的一部分。

在内核这一边有 kernel 和 builtins crates。kernel crate 抽象了跟内核其他部分的接口。利用了 bindgen 工具来生成 binding,从而允许从 Rust 调用内核函数。目前看来还没有需要从 C 语言调用到 Rust 的情况。他认为有一个问题仍然需要完整的解决方案,那就是如何保持 C 语言和 Rust 两边同步。也就是要让 Rust 成为内核中的一等公民,如果开发者做了一个导致 Rust 代码被破坏的改动,那么他们就得负责 fix 这个问题,也就是跟内核的 C 代码待遇要一样。不过,目前还不清楚如何能达到这个效果。

驱动程序作者的观点就很有趣了。他们希望能为驱动通常需要调用的所有内核函数都创建好 Rust binding,打通这一使用场景,但 Rust-on-Linux 开发者的计划不是这样的。相反,他介绍说他们正在扩充 kernel crate 来添加针对一些子系统的抽象层以及接口,希望能在编写驱动程序时不再有任何不 safe 的代码。

Discussion

此时有些人提出了自己的担忧,认为这会要求维护者需要学习 Rust。Ojeda 承认这确实会是有必要的。最终维护者总是需要能够对他们的子系统负责的,尽管 Rust 开发者最初会帮助他们。Laurent Pinchart 说,可能需要很长一段时间的帮助,他没有办法找到时间能停下手头的工作来学习 Rust,所以他将很难对他的子系统中的 Rust 代码负责。

Ojeda 回答说,Rust 的开发者已经意识到了这一点,他们一直在着重挑选那些有时间和兴趣接受这一挑战的维护者的子系统来作为开始。希望这样能创造出足够的例子和经验来对今后引入其他子系统提供帮助。但他重申,维护者需要加入进来。如果 Rust 不是内核中的一等公民,那么这个实验就不会成功。他还说,早一点加入 Rust 的维护者可能会比晚一点加入的维护者能得到更多的帮助,这也是半开玩笑的说法。

708f1c2c140f66a42bdd81114a75340e.png

Ojeda 说,虽然子系统维护者可能会增加一些困难,但对于驱动程序开发者来说生活会更加容易,他们只需要使用提供给他们的(safe)接口就好。Pinchart 反对说,驱动程序编写者经常发现他们需要对核心子系统进行修改,这样才能正确支持他们的设备,所以生活并不是想象的那么简单。他说,如果对驱动程序作者的要求提高到需要精通 Rust,这将会真正阻碍一些人参与进来。

Paolo Bonzini 担心 Rust 代码会抑制 internal kernel API 的改动。开发者可能会发现 Rust 代码是某个 API 的唯一使用者了,但此时可能会懒的修复这部分代码(或者也是没有能力去做这个),所以旧 API 就将继续存在。他问道:Rust 开发者打算为核心内核 API 增加多少个 wrapper?例如,如果 file_operations 结构中只有一些成员变量在 Rust 代码中使用到了,那么是否还会对所有成员变量都生成 binding?如果增加了不必要的 binding 的话可能会导致将来改变这些 operation 的时候变得更加困难。Ojeda 回答说,对于像 file_operations 这么核心的东西,他们可能会把所有成员变量都加进去,因为最终总是都会被使用的。其他情况下,只会实现 Rust 代码实际使用到的接口。

讨论接下来来到了工具链(toolchain),Ojeda 说,Linux 的 Rust 开发者目前只支持某一个特定版本的 Rust 编译器来编译任何一个内核版本。其他版本的编译器可能可以用,但不能保证。最终将有可能只会使用稳定的 Rust 特性来编译内核,那时就有可能支持更多的编译器版本了。他补充说,有人对 Rust 语言的总体稳定性表示担忧,但他认为这不是一个问题。这个语言现在很稳定,而且变得越来越稳定。现在编写的内核代码,即使是使用不稳定功能的代码,"大部分" 在今后也都可以继续使用。

正在开发 gccrs 的 Philip Herron 问道:Linux 的 Rust 开发者特别希望看到用 Rust 编写哪些部分的代码?Ojeda 的观点是文件系统以及其他一些包含大量状态的子系统将是很好的选择。Herron 接着问到,是否有计划挑选 Rust 语言的一个特定子集来用在内核中。他具体谈到了常量泛型(const generics),他说,这将是一个很适合在内核环境中使用的功能。但是会不会有一天会变得必须禁用这个功能从而减少维护者的负担?Ojeda 说,一些更高级的功能在 core 代码中可能是有用的,但他更希望看到驱动程序使用 Rust 语言中比较小的一个子集,避免像 "crazy metaprogramming" 之类的东西。

此时,会议的时间已经用完了,与会者们去喝咖啡了。更深入的讨论就放到了接下来的两天时间里。超过 30 名开发者参加了这次会议,这表明人们对用 Rust 编写内核代码这个想法有相当大的兴趣,即使这个功能目前还不在 mainline kernel 中。Rust in kernel 不是一个可以容易让人们接受方案,但就算它最终失败了,也不用后悔,毕竟都努力尝试过了。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

9b71a822774d80e892b78d5d19aa6423.png

如何使用 rust 写内核模块 近年来,Rust 语言以内存安全、高可靠性、零抽象等能力获得大量开发者关注,而这些特性恰好是内核编程中所需要的,所以我们看下如何用rust来写Linux内核模块。 阅读详情

相关推荐

Linux内核编译指南:从环境准备到性能优化

Linux内核作为操作系统的核心组件,其编译过程是系统管理员和开发者的重要技能。内核编译技术涉及工具链配置、源码获取、选项定制等关键环节,通过合理配置可以显著提升硬件兼容性和系统性能。在云计算和嵌入式领域,内核定制能优化资源利用率,例如针对特定CPU架构的调度器调优可带来5%以上的性能提升。实践中常见场景包括驱动开发(如WiFi6网卡支持)、实时系统构建(CONFIG_PREEMPT_RT配置)以及安全加固。Ubuntu等发行版虽然提供预编译内核,但手动编译能解决硬件兼容性问题,如Intel Arc显卡支持

weixin_34245082的博客 355

LWN:使用Rust进行Linux kernel开发!

Supporting Linux kernel development in RustAugust 31, 2020This article was contributed by Nel...

Linux News搬运工 1085

rust-kernel:一个小的多任务卵石启发了用Rust编写的内核

x86 Rust内核 这是用Rust编写的x86多线程内核的实现。 内核当前支持内核级线程,虚拟文件​​系统(受Linux启发)和原始驱动程序框架(受Windows启发)。 去做: IDE驱动程序。 ELF解析器。 用户空间加载器。 系统调用。 进程生命周期(fork / exec / wait /消失)。 调度(收益/调度/ make_runnable /睡眠)。 内存管理(mmap / munmap)。 IPC(???)。 安全性得到改善(去除包装纸等)。 动态加载,内核模块。 建造 内核必须由使用夜间配置构建的1.1.0之后的Rust编译器构建,以支持不稳定的功能和drop_in_place函数。 该构建链接到lib目录中预编译的libcore版本。 如果编译器的版本与用于编译libcore的版本不同,则可能会出现恐慌。 如果发生这种情况,请重新编译libc

使用Rust编写Linux内核模块:一个创新的实践

使用Rust编写Linux内核模块:一个创新的实践 项目地址:https://gitcode.com/gh_mirrors/lin/linux-kernel-module-rust 在软件开发领域,Rust语言以其强大的安全性和高性能赢得了开发者们的喜爱。然而,传统的Linux内核模块多数是用C或C++编写的,这通常涉及到内存管理和并发问题,可能会引入安全隐患。现在, 开发的一个项目,将Rust带...

gitblog_00006的博客 982

MATLAB数据可视化:pcolor函数从入门到精通(附colormap调色秘籍)

本文深入解析MATLAB中pcolor函数的数据可视化应用,从核心机制、坐标网格指定到常见陷阱规避。重点揭秘colormap调色秘籍,涵盖内置色系选用原则、个性化定制方法及高级渲染技巧,助你创作出信息准确、视觉出色的专业图表,精通从数据到出版级图表的全流程。

kafka6courier的博客 245

Ubuntu安装ToDesk远程控制软件

前几天有同学问我怎么在 Ubuntu 系统上安装 ToDesk 远程控制软件, 帮他安装完成后就 顺手整理了一下安装过程,所以就顺手有了这篇在 Ubuntu 系统上安装 todesk 的文章。

小白的博客 8657

LWN: Rust 中对于Linux kernel有用的关键特性!

关注了就能看到更多这么棒的文章哦~Key Rust concepts for the kernelBy Jonathan CorbetSeptember 17, 2021Kangrejos...

Linux News搬运工 518

adb 通信协议分析以及实现 (三) (Adb 网络通信部分解析)

这篇文章说下adb 和adb 服务进程之间通信的socket 协议。  adb 服务进程启动之后,会监视本地的5037 端口,使用的是TCP 协议,所以adb 发送的命令其实就是往本地的5037 端口发送数据,做过网络编程的都知道,本机可以用127.0.0.1 ip地址。 有了ip 地址和端口号socket 通信就没问题 1)  命令发送方式      

inforecovvery的博客 2870

LWN:如何在 kernel 里写 Rust 代码:第一部分!

尽管 GCC 上对 Rust 的支持正在迎头赶上,并且 `rustc_codegen_gcc` 代码生成后端现在能够编译内核的 Rust 组件,但 Rust for Linux 项目目前仅支持使用纯粹的 `rustc` 进行构建。Rust 开发者可能还应该安装 Clippy(Rust 的代码 Lint 工具),rustdoc(Rust 的文档构建工具)和 rust-analyzer(Rust 的 语言服务器),但这些并非严格必需。构建和测试 Rust 代码是审查 Rust 代码的必要条件,但并非充分条件。

Linux News搬运工 1649

血管分割中的直径平衡难题:从clDice到cbDice的演进与实践

本文探讨了血管分割中的直径平衡难题,详细分析了从clDice到cbDice的技术演进与实践。通过引入半径感知权重和边界对齐惩罚,cbDice在保持拓扑完整性的同时提升了几何敏感度,显著改善了细小血管的分割效果。文章还分享了在nnU-Net中实现cbDice的工程细节,包括GPU加速骨架提取和多任务损失组合策略,为医学影像分析提供了重要参考。

weixin_29170327的博客 239

从零构建锂电池主动均衡系统:Simulink仿真中的Buck-Boost拓扑实战指南

本文详细介绍了如何在Simulink中从零构建基于Buck-Boost拓扑的锂电池主动均衡系统。通过仿真环境搭建、参数优化、控制策略设计和性能评估,为工程师提供了完整的实战指南,帮助快速验证和优化均衡算法,提升电池组一致性与寿命。

gitlab7runner的博客 896

LWN: kernel 快要有 Rust 了?

关注了就能看到更多这么棒的文章哦~Rust heads into the kernel?By Jake EdgeApril 21, 2021DeepL assisted translati...

Linux News搬运工 411

【点云鸟瞰图BEV】点云鸟瞰图BEV原理与可视化

本节将介绍激光雷达等点云的鸟瞰图生成原理、代码及效果图。 1 BEV视图原理 点云BEV(Bird's Eye View)视图是指点云在垂直于高度方向的平面上的投影。通常,在获得bev视图前,会将空间分割成体素,利用体素对点云进行下采样,然后将每个体素作为一个点进行投影。体素是指将三维空间按照固定尺寸长方体进行划分时的长方体(Δl*Δw*Δh)。 体素投影时可以得到BEV视图的像素点坐标。每个像素点的特征取值则可以通过多种方式得到。 ...

叶子的博客 2万+

LWN:Rust 另一些对 kernel 有用的特性!

关注了就能看到更多这么棒的文章哦~More Rust concepts for the kernelBy Jonathan CorbetSeptember 20, 2021Kangrejo...

Linux News搬运工 476

电磁场仿真软件:CST Studio Suite_(25).案例分析与实践

在电磁场仿真中,材料属性的设置至关重要。通过API,您可以轻松地设置和修改材料属性,以适应不同的仿真需求。通过以上案例分析和实践,您已经学会了如何在CST Studio Suite中进行二次开发。自动化仿真流程:批量创建和运行仿真项目、优化设计参数、生成报告。自定义仿真设置:设置材料属性、边界条件和激励源。数据处理与分析:读取仿真结果、数据可视化和数据导出。高级脚本开发:多线程仿真、集成机器学习和云仿真。这些技能将帮助您更高效地进行电磁场仿真,提高设计质量和工作效率。

kkchenjj的博客 1384

UG\NX二次开发 找不到指定的dlx文件(Specified Dlx file not found)

有群友问:用Ctrl+U运行的时候就报错,找不到指定的dlx文件Specified Dlx file not found。怎么处理。

王牌飞行员_里海的博客 1129

LWN:维护者峰会上讨论Rust in kernel!

关注了就能看到更多这么棒的文章哦~Using Rust for kernel developmentBy Jonathan CorbetSeptember 27, 2021Maintain...

Linux News搬运工 225

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LWN:学习Rust内核开发的可用资源!

关注了就能看到更多这么棒的文章哦~Resources for learning Rust for kernel developmentBy Daroc AldenSeptember 23, 2024Kangrejos 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/990619/Dirk Behme 在 Kangrejos 2024...

Linux News搬运工 1456

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

LWN:6.2内核中的Rust!

关注了就能看到更多这么棒的文章哦~Rust in the 6.2 kernelBy Jonathan CorbetNovember 17, 2022DeepL assisted translationhttps://lwn.net/Articles/914458/6.1 版本的合并窗口带来了对用 Rust 编写内核代码的基本支持,这里的关键词是 "基本"。在 6.1 版本中可以创建一个 "hell...

Linux News搬运工 734

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LWN:内核处理Rust代码的流程!

Hindborg 同意,但他也指出,在块(block)子系统中,开发者进行更改时并不担心 Rust 方面的问题。当他收到问题报告时,他会在一天内修复它,一切都会很好。如果 Rust 代码要通过常规的子系统树(subsystem trees),那么维护者至少应该对这些代码进行构建测试(build tests),并且应该有一个明确的方案来应对构建出错(build break)的情况。在他的结论中,他重申,自 6.10 版本以来,Rust 编译器的最低版本一直保持在 1.78.0,即使较新的版本已经获得了支持。

Linux News搬运工 1659

LWN:内核热点: folio,多代LRU,以及Rust!

关注了就能看到更多这么棒的文章哦~The kernel radar: folios, multi-generational LRU, and RustBy Jonathan CorbetJ...

Linux News搬运工 1822

LWN:内核中Rust支持的下一步动作!

关注了就能看到更多这么棒的文章哦~Next steps for Rust in the kernelBy Jonathan CorbetSeptember 19, 2022Maintainers SummitDeepL assisted translationhttps://lwn.net/Articles/908347/Rust for Linux 这个项目是希望今后可以使用 Rust 编程语言...

Linux News搬运工 352

LWN: 内核 Rust 实验的现状

关于将核心内核(core-kernel)对 Rust 代码的依赖性,Airlie 表示,这在未来一两年内不应该发生。Kroah-Hartman 说,他曾担心核心内核和 Rust 驱动程序之间的交互,但发现交互比他预期的少得多。Ojeda 说他已经调查过,认为它应该可以工作,但他不知道目前的状况。Ojeda 总结说,用 Rust 工作的能力成功地吸引了新的开发者和新的维护者,这是该项目最初的目标之一。他说,更重要的消息是,运行 6.12 内核的 Android 16 系统正在搭载 Rust 编写的。

Linux News搬运工 200

LWN:6.3合并窗口的第二部分!

关注了就能看到更多这么棒的文章哦~The rest of the 6.3 merge windowBy Jonathan CorbetMarch 6, 2023DeepL assisted translationhttps://lwn.net/Articles/924384/Linus Torvalds 于 3 月 5 日发布了 6.3-rc1,按时关闭了 6.3 合并窗口。那时已经有 12717...

Linux News搬运工 897

LWN:6.2合并窗口的第二部分!

关注了就能看到更多这么棒的文章哦~The rest of the 6.2 merge windowBy Jonathan CorbetDecember 27, 2022DeepL assisted translationhttps://lwn.net/Articles/918146/今年,世界收到了从 Linus Torvalds 来的一份特殊的圣诞礼物:6.2-rc1 kernel prepat...

Linux News搬运工 569

LWN:6.10 合并窗口前半部分!

关注了就能看到更多这么棒的文章哦~The first half of the 6.10 merge windowBy Jonathan CorbetMay 16, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/973687/6.10 内核版本的合并窗口于 5 月 12 日开启;截至本文撰写之时,已有 6819 个非合并提交被拉入该...

Linux News搬运工 556
上一篇: LWN:DVB与头文件和用户空间的regression!
下一篇: LWN: 改进GCC的 -fanalyzer 选项!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值