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

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

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

A process for handling Rust code in the core kernel

By Jonathan Corbet
March 27, 2025
LSFMM+BPF
Gemini-1.5-flash translation
https://lwn.net/Articles/1015409/

2024 年的 Linux 存储、文件系统、内存管理和 BPF 峰会包括 一次气氛紧张的会议,讨论了在内核文件系统层中使用 Rust 代码的问题。2025 年,Rust 话题再次出现,由 Andreas Hindborg 主持会议,范围也涵盖了存储和内存管理层。已经取得了很大进展,今年的讨论对抗性有所减少,但仍有一些流程问题需要解决。

如何将 Rust 代码提交到上游

Hindborg 首先指出,Rust 代码进入内核有多种途径,他将这些途径按照“Brauner-Hellwig 量表”进行排列。在 Brauner 一端,一些子系统直接接受 Rust 代码并自行维护;虚拟文件系统层(virtual filesystem layer,由 Christian Brauner 共同维护)就是一个例子。在这些子系统中,Rust 补丁就像其他任何补丁一样被接受。

沿着量表往下看,一些子系统的开发者希望能够直接接受 Rust 代码,但维护者承认他们需要帮助才能做到这一点。内核的模块加载器(module loader)就是一个例子;为了合并这些代码,Rust 社区的专家一直在提供帮助。其他子系统指定一个单独的子维护者来处理 Rust 代码;块层(block layer)被提及使用了这种模式。

然后,还有一些子系统根本不处理 Rust 代码;对于这些子系统,代码会通过 Rust 树(Rust trees)提交。在某些情况下,维护者是愿意的,并且会充当审查者,但不认为他们可以直接处理这些代码;时间管理(timekeeping)在这里被提及。最后,有些子系统根本不与 Rust 开发者合作;他们只是不想了解 Rust 代码。DMA 映射(DMA-mapping) 和 XArray 子系统就是这种情况。

Hindborg 说,这些模式都没有错,但最后一种效率最低。一个子系统的 C 语言维护者最了解该子系统,因此需要他们的投入才能获得最佳结果。他说,理解 Rust 并不是审查提交内容的必要条件;Rust 代码有大量的文档记录,对代码预期语义的注释是最重要的。

Ted Ts'o 说,如果能对测试和破坏(breakage)设定更明确的预期,那将会有所帮助。如果 Rust 代码要通过常规的子系统树(subsystem trees),那么维护者至少应该对这些代码进行构建测试(build tests),并且应该有一个明确的方案来应对构建出错(build break)的情况。如果树(tree)无法构建,他问道,是否应该在一段时间后直接删除补丁?Hindborg 回答说,如果在合并之前观察到中断,那么应该立即删除补丁。但他说,通常情况下,当发生中断时,人们会直接修复它并继续前进。

David Hildenbrand 指出,更改 C 接口可能会需要更改大量的 Rust 代码才能匹配。如果 Rust 代码没有在同一个树(tree)中维护,那么不清楚应该如何拆分补丁。Hindborg 说,这样的补丁可以像任何树范围(tree-wide)的系列补丁一样处理。如果需要,开发者可以创建一个新的 API 并缓慢地将代码转换到该 API。如果开发者在更改 Rust 代码时遇到问题,他们可以寻求帮助。

Liam Howlett 说,如果他合并了一个破坏 Rust 代码的更改,那么会立即导致问题,例如破坏持续集成(continuous-integration)构建。然后,指责的矛头会指向他。能够一起完成所有这些更改将非常重要。Hindborg 同意,但他也指出,在块(block)子系统中,开发者进行更改时并不担心 Rust 方面的问题。当他收到问题报告时,他会在一天内修复它,一切都会很好。Howlett 回答说,这种方法是不可扩展的;更多使用 Rust 的子系统会导致更多麻烦。Hindborg 同意,最好能在一个系列中完成所有的更改,但他不认为他可以要求开发社区这样做 —— 或者即使他提出了要求,也无法得到满足。Petr Tesařík 指出,破坏 Rust 代码可能会给试图进行回归分析(bisect regressions)的开发者带来麻烦。

Hindborg 询问块(block)子系统维护者 Jens Axboe 接受 Rust 代码的经验;Axboe 回答说,这几乎没有增加任何开销。他说,如果有什么东西坏了,他经常会在甚至意识到问题之前就收到修复该问题的补丁。一切都运行良好,但他指出,块(block)子系统目前还没有大量的 Rust 代码。当 Hindborg 询问时,Axboe 说他确实启用了 Rust 进行构建,但无法运行测试所有内容。

Ts'o 说,直到最近他才进行启用 Rust 的构建,而且仍然没有定期进行。原因是他的测试基础设施(test infrastructure)是基于 Debian stable 的,而该发行版没有足够新版本的 Rust 编译器。他已经使用 Debian testing 使其正常工作,但运行该发行版会带来其他问题。Hindborg 说,这是一个容易解决的问题,只需要等待。最低版本的 Rust 在一段时间内一直是 1.78.0;随着时间的推移,这些问题将会消失。

Matthew Wilcox 说,他的系统上没有最新的 Rust,因为他不喜欢当系统管理员。他把这项工作留给发行商;在发行商提供合适的编译器之前,他就不会使用它。Jason Gunthorpe 说,他曾尝试在 Ubuntu LTS 上进行 Rust 构建,但 内核文档 中的说明在那里不起作用;Hindborg 说他会确保修复它。

当前和未来状态

Hindborg 说,一组用于 configfs 文件系统的抽象已经准备好供考虑,但是 configfs 的维护团队最近被“削减了一半”(在 Christoph Hellwig 停止做这项工作之后)。只有一位维护者,而且不回复电子邮件。事实证明,列出的维护者已经退休;Hindborg 被建议将他从维护者条目中删除,并接管该子系统。

Hindborg 说,最近取得了很多进展。“rnull stub”(一个块 null 设备驱动程序)已经合并,他说,32 位 x86 系统的 Rust 支持也已经合并。现在可以从 kernel.org 下载 Rust 工具链。其他合并的代码包括用户空间访问模块(user-space access module), struct page 、 struct file 和 struct cred 的抽象,以及一个链表实现(linked-list implementation)。渲染后的内部文档 可以在 kernel.org 上找到。

第一个用 Rust 编写的“真正的”驱动程序,用于 Applied Micro QT2025 PHY 设备,已经合并。KASAN 清理器(KASAN sanitizer)和 Clang 控制流完整性(Clang control-flow integrity)都可以与 Rust 代码一起工作。还有一个用于 misc 设备的抽象,对跟踪点(tracepoints)和 RCU 读取锁定的支持。他说,内存管理抽象的添加也大大改进了虚拟内存区域(virtual memory area,VMA)锁定文档。

展望未来,Hindborg 说,有争议的 DMA 映射抽象(DMA-mapping abstractions)即将到来 [当您阅读本文时,可能已经发生了]。将会有对高分辨率定时器(high-resolution timers)、模块参数(module parameters)、I/O 轮询(I/O polling)、XArray 数据结构、 iov_iter 机制和 VMA 的支持。从长远来看,Nova 图形驱动程序正在向前发展;这将是一项为期多年的工作。

在他的结论中,他重申,自 6.10 版本以来,Rust 编译器的最低版本一直保持在 1.78.0,即使较新的版本已经获得了支持。他说,目前内核只需要四个不稳定的功能,而且这个数字很快就会变为零。编译器团队在其持续集成测试中包含了内核构建,以确保它们不会破坏它。他说,内核是 Rust 项目的“旗舰目标”;Rust 开发者认真对待内核项目,希望它能正常工作,并为此投入资源。

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

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

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

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 立即下载

相关推荐

linux-kernel-module-rust:在安全的Rust中编写Linux内核模块的框架

安全Rust中Linux内核模块 对于大多数目的,如果您有兴趣在Rust中编写Linux内核模块,则应查看 ,这是将该过程贡献给上游内核的一种努力。 这是一个用于在Rust中使用围绕内核接口和原语的安全抽象来编写可加载Linux内核模块的框架。 有关此项目的动机和目标的更多信息,请查看以及。 我们立即将重点放在使该项目适用于树外模块的可行性上,但是我们也将该项目视为是否可以用Rust编写树内组件的测试平台。 hello-world目录中有一个简单的演示模块,而tests /目录中有各种其他示例。 设计 我们在内核头文件上运行以生成自动Rust FFI绑定。 bindgen由提供支持,因此我们使用内核自己的构建系统来确定适当的CFLAGS。 然后,我们为这些类型编写安全绑定(请参阅src/的各种文件)。 Rust中的每个内核模块都staticlib在staticlib板条箱中,该板条

LWN: Linux kernel 中的Rust!

关注了就能看到更多这么棒的文章哦~The Rust for Linux projectBy Jonathan CorbetSeptember 16, 2021KangrejosDeepL ...

Linux News搬运工 838

SAP ABAP ALV表格实战:5分钟搞定单元格下拉框配置(附完整代码)

本文详细介绍了在SAP ABAP开发中如何快速配置ALV表格的单元格下拉框功能,通过5分钟实战教程帮助开发者掌握关键步骤。文章包含完整的ABAP代码示例,涵盖下拉值定义、字段目录配置及ALV控件绑定等核心操作,特别适合需要实现财务系统费用类型选择或采购系统物料分类等场景的开发者参考。

weixin_28331555的博客 108

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

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

Linux News搬运工 1085

对比实验系列:Efficientdet环境配置及训练个人数据集

可以通过下方链接下载Efficientdet源码。

Yayisheng的博客 4585

PCIe控制器深度解析-RK3588 PCIe子系统核心模块探秘

本文深度解析了RK3588芯片中PCIe子系统的核心架构与功能模块。文章将PCIe控制器比作智能交通枢纽,详细阐述了RADM、XADM、CDM、eDMA等核心模块的工作原理,包括数据流管理、地址转换、DMA加速及电源管理。旨在帮助开发者和硬件工程师深入理解RK3588 PCIe控制器的内部机制,为驱动开发、性能优化和故障排查提供清晰的思路与实用指导。

weixin_29246195的博客 187

使用rust自制操作系统内核

本操作系统是一个使用rust语言实现,基于32位的x86CPU的分时操作系统。GitHub - CaoGaorong/os-in-rust: 使用rust实现一个操作系统内核如下图是该项目的文件结构:下面我挑几个重点的模块介绍:模块名称模块类型模块介绍buildmakefile生成make之后生成的文件cat用户程序(独立进程)(写入到文件系统,然后shell可以加载成为一个进程运行)自制的cat程序,把文件系统中的文本文件内容输出到控制台echo。

m0_55708805的博客 4342

AGM Supra软件从零到一:国产CPLD工程创建全流程拆解

本文详细拆解了AGM Supra软件从零开始创建国产CPLD工程的全流程,包括开发环境配置、工程创建、Quartus项目转换、TCL脚本执行与编译等关键步骤。特别强调了中文路径避坑、器件型号选择等实用技巧,帮助开发者高效完成CPLD开发任务。

weixin_29158413的博客 410

LWN:企业内核使用Rust!

关注了就能看到更多这么棒的文章哦~On Rust in enterprise kernelsBy Jonathan CorbetOctober 10, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/993337/在最近结束的维护者峰会上,大家普遍同意 Rust 实验将继续进行,并且路线已经明确,可以将更多 Rust 代码引入内核。...

Linux News搬运工 1874

碰撞检测 | 图解视线生成Bresenham算法(附ROS C++/Python/Matlab实现)

Bresenham视线生成是一种高效的算法,用于在二维网格上绘制直线。Bresenham算法可以应用在栅格地图中进行一维碰撞检测,即检查起点和终点间直线是否穿过障碍栅格。本文图解Bresenham碰撞检测的原理,并给出ROS C++/Python/Matlab三种实现加深理解

FRIGIDWINTER的博客 1万+

基于Simulink的电气弹簧ES稳压控制模型仿真

在本文中,我们将使用Simulink建立一个ES稳压控制系统的模型,并通过仿真验证其性能。接下来,我们配置了各个组件的参数,包括电源电压、负载电流以及ES和控制器的传递函数。通过调整模型中的参数和控制算法,我们可以进一步优化系统的性能并实现更好的电压稳定调节。该系统通过对电力系统中的ES进行控制,调整其阻尼特性,以实现对电压的稳定调节。例如,我们可以设置电源的电压值、负载的电流值,以及控制器的参数(如PID控制器的比例、积分和微分增益)。反馈控制可以根据测量值来调整控制器的输出,从而实现对电压的稳定调节。

DevProZ的博客 421

【Rust日报】 LWN《Rust 内核实验的情况》

最后,我们概述了未来的工作方向,包括支持组合分析和双向溯因推理。12 月的 RFMIG 分享的主题是 Soteria Rust,它是第一个完全支持对 Rust 语言复杂的别名模型(树借用)进行推理的 Rust 符号执行引擎,同时其性能可与 Rust 最先进的有界模型检查器 Kani 相媲美。在 2025 年 11 月不仅发布了多个核心库(Parley, Kurbo)的新版本,还在渲染特效(Vello)和 GUI 框架的实用性(Xilem)上迈出了重要一步,同时获得了持续发展的资金保障。

Rust语言学习交流 1063

数控系统(CNC)系列:Hurco VMX42SR_(3).控制系统硬件组成部分

控制箱是CNC系统的核心部分,负责处理所有的控制指令和数据。它通常包含主控板、电源模块、接口板等关键组件。伺服驱动器是CNC系统中的关键组件,负责将主控板发出的控制信号转换为电机所需的驱动电流。它通过闭环控制确保电机的精确运动。电机是CNC系统中的执行机构,负责实现主控板发出的运动指令。常见的电机类型包括步进电机和伺服电机。传感器是CNC系统中的重要组件,用于检测和反馈机床的运行状态。常见的传感器类型包括位置传感器、速度传感器、温度传感器等。电源供应系统为CNC系统的所有组件提供电力。主电源。

2401_87715305的博客 1278

LWN:内核开发即将支持哪些 Rust 语言特性!

由于 Rust for Linux 开发者希望使用自定义智能指针来处理不可信数据(untrusted data)、引用计数(reference counting)、外部锁(external locking)以及相关的内核复杂性,因此他们将受益于一个通用的语言特性,该特性允许所有指针类型使用相同语法进行字段投影。内有效的指针类型,投影一个字段会得到一个包裹了该结构体字段的(可能不同的)输出指针类型,且在相同的生命周期内有效。在 Rust 中,类型上的方法可以将类型本身的实例作为第一个参数,也可以是其引用。

Linux News搬运工 671

12、硬件工程师笔试面试——MOS管(2025版本)

在设计和测试过程中,可以参考相关的EMC测试标准和指南,如CE认证EMC电磁兼容测试介绍 和电磁兼容性(EMC)测试方法与整改指南 ,以及电磁兼容(EMC)的标准与测试内容 ,来确保MOSFET的EMC性能符合行业标准。在高频应用中,MOSFET的开关速度对电路的整体性能至关重要。是一款高电压同步N沟道MOSFET驱动器,具有自举电源电压至114V的能力,宽VCC电压范围,自适应贯通保护功能,以及高达1.4A的峰值顶端栅极上拉电流,适用于分布式电源架构、汽车电源、高密度电源模块和电信系统等应用。

XU157303764的博客 7089

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LWN:高效的Rust tracepoint!

关注了就能看到更多这么棒的文章哦~Efficient Rust tracepointsBy Daroc AldenOctober 8, 2024Kangrejos 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/992455/Alice Ryhl 一直致力于将内核中广泛使用的tracepoint(跟踪点)无缝地放入 Rust 代...

Linux News搬运工 1782

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

LWN:内核中基于Rust 的time API!

关注了就能看到更多这么棒的文章哦~Kernel time APIs for RustBy Jonathan CorbetMarch 2, 2023DeepL assisted translationhttps://lwn.net/Articles/924746/虽然 6.3 内核已经增加了对 Rust 语言支持,但目前仍然只能用 Rust 来创建一个“hello world” module。当然,...

Linux News搬运工 827

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

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

在用户空间的 Rust 项目中,程序通常也会从 std(Rust 的标准库)中导入一些内容,但在内核中这不可行,因为内核需要对内存分配和其他标准库抽象掉的细节有更精确的控制。的形式书写,它适用于其所出现的定义内部。约定俗成是,对于返回值的宏使用圆括号,而对于调用以定义结构体的宏使用花括号(此处即是这种情况),但这并非强制要求。在驱动程序的 C 版本中,下一步是定义一些常量,它们代表了该驱动程序支持的三种不同但相关的设备:AX88772A、AX88772C 和 AX88796B。每个板卡对应的类型(例如。

Linux News搬运工 1725

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

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

Linux News搬运工 1822

LWN:LWN 在招聘!

关注了就能看到更多这么棒的文章哦~LWN is hiring[Posted May 18, 2022 by corbet]DeepL assisted translationhttps://lwn.net/Articles/895695/LWN 致力于对自由软件开发社区的提供全面的报道,但这里所发生的事情远远超过我们这么少几位职员的处理能力了。上面这句话听起来像是有一个明...

Linux News搬运工 393

LWN:内核要给Rust什么地位?

关注了就能看到更多这么棒的文章哦~Committing to Rust for kernel codeBy Jonathan CorbetNovember 22, 2023Maintainers SummitChatGPT translationhttps://lwn.net/Articles/952029/在过去的几年里,Rust 一直是 Kernel Maintainers Summit 的一...

Linux News搬运工 852

LWN:Coccinelle的Rust支持!

关注了就能看到更多这么棒的文章哦~Coccinelle for RustBy Daroc AldenSeptember 30, 2024Kangrejos 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/991399/Tathagata Roy 一直致力于将Coccinelle工具应用于 Rust 代码的重构自动化(当然还保留其...

Linux News搬运工 1147

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

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

Linux News搬运工 476
上一篇: LWN:GCC BPF 支持的进展!
下一篇: LWN:buffer write 时不被“撕裂”!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值