您当前的位置:首页 > 电脑百科 > 软件技术 > 操作系统 > linux百科

在 Linux 新版内核中的 Rust 初探,原来是这样的!

时间:2022-10-18 14:51:34  来源:CSDN  作者:

整理 | 苏宓

出品 | CSDN(ID:CSDNnews)

近来,Rust 爆火。

不久之前,53 岁的 Linus Torvalds 在出席 linux 基金会主办的 2022 开源峰会时表示,下一个版本的 Linux 内核主线,可能就会合并 Rust 语言提交的 PR 分支。然而,在五天前有开发者询问 Linus 是否在 Linux 6.1 进行补丁合并时错过了一个 Git Pull 请求时,对方称他的电脑内存有问题,合并速度很慢,或将导致 Linux 6.1 补丁合并推迟。

正当众人怀疑他买了一个二手的翻新 ECC 时,10 月 13 日,Linux 内核开发者 Jonathan Corbet 惊喜地分享了一则关于“Linux 6.1 中 Rust 初探”的好消息。接下来,我们将与大家一下看看 Linux 和 Rust 遇到一起,将带来哪些“火花”?

 

最新进展

根据 Jonathan Corbet 的介绍,在 Linux 6.1 版本中,有很多重要的变化被合并到主线中,而引入对 Rust 的支持也只是其中一个最受关注的方面。虽然 Rust 的到来,为内核开发者的创新带来了一些不同,但是他也发现当前 Linux 内核中的 Rust 还不能做很多有趣的事情。

为 Linux 内核开发 Rust 的工作其实早在几年前就已经开始了,它已经产生了许多支持代码和一些有趣的驱动程序,包括在 Linux 内核中用 Rust 语言编写一个苹果图形驱动。

不过,在最初并入主线内核时,Linus Torvalds 明确表示,应该尽可能少地包含一些功能。因此,这些驱动程序和它们的支持代码被去掉了,必须等待未来的内核发布时候才会被加进来。现在有的只是建立一个可以载入内核的模块所需的支持,以及一个小的示例模块。

 

构建 Rust 支持

为了让对此感兴趣的开发者更加清楚明白 Linux 内核中 Rust 的支持功能,Jonathan Corbet 分享了开发者可能会遇到的一些问题。

譬如,内核配置过程会在构建系统上寻找先决条件,如果不存在,就会默默地禁用 Rust 选项,这样它们甚至不会显示。

因此,构建 Rust 支持需要特定版本的 Rust 编译器和 bindgen (一个能自动为 C(或 C++)库生成 Rust 绑定的辅助库和命令行工具)工具。具体来说,就是 Rust 1.62.0 和 bindgen 0.56.0 版本。

如果目标系统有更新的版本,配置过程会发出警告,但无论如何还是会继续。对于那些试图用分销商提供的 Rust 工具链进行构建的人来说,更尴尬的是,构建过程还需要 Rust 标准库的源代码,这样它就可以构建自己的核心和 alloc crates 的版本。在分销商开始提供 "Rust for the kernel "包之前,把这些代码放到构建过程可以找到的地方是有点困难的。

获得这种依赖项的方法是放弃分销商的工具链,而从 Rust 存储库中安装所有的东西。其中,Rust 官方的使用指南上详细地描述了 Rust 的上手过程(https://www.rust-lang.org/learn/get-started)。

 

示例模块

在安装完成后,内核配置系统将设置 CONFIG_RUST 选项,这个选项将可以用于构建示例模块。该模块(samples/rust/rust_minimal.rs)确实很小,但它足以让我们了解 Rust 中的内核代码会是什么样子。首先,写下类似于 #include 的代码行:

use kernel::prelude::*;

在 rust/kernel/prelude.rs 中找到声明的拉取,使得一些类型、函数和宏可用。

用 C 语言编写的内核模块包括对 MODULE_DESCRIPTION() 和 MODULE_LICENSE() 等宏的一些调用,这些宏将有关模块的元数据存放在一个单独的 ELF 部分。module_init() 和 module_exit() 宏分别标识模块的构造函数和析构函数。Rust 等同于将大部分的模板放在一个宏调用中。

module! {

type: RustMinimal,

name: b"rust_minimal",

author: b"Rust for Linux Contributors",

description: b"Rust minimal sample",

license: b"GPL",

}

这个宏对各个字段的顺序很挑剔,如果开发者弄错了就会抱怨。除了把所有这些信息放到一个调用中,“moudule!”宏还包括一个 type: ,它将指向实际模块代码的指针。是实际模块代码的指针。开发者系统可以有一个能做有趣事情的模型,在示例模块中,该类型可以帮助开发者实现愿望。

struct RustMinimal {

numbers: Vec

,

}

它是一个包含 32 位整数值的 Vec。本身 Rust 允许为结构类型添加接口("trAIt")实现。因此,这个示例模块为 RustMinimal 类型实现了 kernel::Module trait。

impl kernel::Module for RustMinimal {

fn init(_module: &'static ThisModule) -> Result

{

pr_info!("Rust minimal sample (init)n");

pr_info!("Am I built-in? {}n", !cfg!(MODULE));

let mut numbers = Vec::new();

numbers.try_push(72)?;

numbers.try_push(108)?;

numbers.try_push(200)?;

Ok(RustMinimal { numbers })

}

}

这个 init() 函数常常被认为是做常规模块初始化的工作。但在这种情况下,被期望做常规的模块初始化工作。在这种情况下,它向系统日志做了一些反馈(在这个过程中,它通过 cfg!()宏,可以在编译时用于查询内核配置参数)。然后,它分配了一个可变的 Vec,并试图将三个数字放入其中。try_push() 的使用在这里很重要:一个 Vec 会在必要时调整自己的大小。这涉及到分配内存,这在内核环境中可能会失败。

如果分配失败,try_push() 将返回一个失败的状态,这反过来将导致 init() 返回失败(这就是代码行最后"?"的作用)。

那么,如果一切顺利,它会返回一个 RustMinimal 结构,其中包含分配的 Vec 和一个成功状态。由于这个模块没有与任何其他内核子系统交互,实际上它不会做任何事情,只是耐心地等待被删除。在 Kernel::Module trait 中没有移除模块的函数;相反,这里使用一个简单的 RustMinimal 类型的析构器。

impl Drop for RustMinimal {

fn drop(&mut self) {

pr_info!("My numbers are {:?}n", self.numbers);

pr_info!("Rust minimal sample (exit)n");

}

}

这个函数打印出初始化时存储在 Vec 中的数字(从而确认数据在此期间存活)并返回,之后,该模块将被删除,其内存被释放。似乎没有办法让模块删除失败。

 

 

最后

在最后,Jonathan Corbet 说道,这就是在 Linux 6.1 中可以对 Rust 内核模块所做的事情的大致范围。这是一个可以玩的东西,但它目前还不能用于任何形式的真正的内核编程

他表示,“希望这种情况在不久的将来会有所改变。如果幸运的话,Linux 6.2 版内核中的 Rust 将大大增强能力。”

来源:https://lwn.NET/SubscriberLink/910762/a26f968ea086e32d/



Tags:Rust   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Rust编程语言的内存安全与性能:如何平衡?
Rust编程语言自诞生以来,就以其独特的内存安全特性和高性能而备受瞩目。然而,如何在保证内存安全的同时,实现高效的性能,一直是Rust开发者们面临的挑战。本文将深入探讨Rust的内...【详细内容】
2024-04-12  Search: Rust  点击:(2)  评论:(0)  加入收藏
聊聊Rust里面的数据类型
嘿,朋友们!今天我们来聊聊Rust里面的数据类型。你知道吗?Rust的数据类型可是很重要的哦,它们帮助我们定义变量和函数可以处理什么样的数据。基本数据类型首先,让我们来看看Rust提...【详细内容】
2024-04-11  Search: Rust  点击:(2)  评论:(0)  加入收藏
Rust 标准库 1.77.2 发布,修复高危漏洞
IT之家 4 月 10 日消息,Rust 的优势之一就是安全,但这并不代表该编程语言就没有漏洞。安全专家近日发现了追踪编号为 CVE-2024-24576 的漏洞,攻击者利用 Rust 标准库中的一个安...【详细内容】
2024-04-10  Search: Rust  点击:(4)  评论:(0)  加入收藏
在Rust中使用Serde的详细指南
在处理HTTP请求时,我们总是需要在一种数据结构(可以是enum、struct等)和一种可以存储或传输并稍后重建的格式(例如JSON)之间来回转换。Serde是一个库(crate),用于高效、通用地...【详细内容】
2024-03-26  Search: Rust  点击:(17)  评论:(0)  加入收藏
Rust 写脚手架,Clap你应该知道的二三事
有感而发最近,在和前端小伙伴聊天发现,在2024年,她们都有打算入局Rust学习的行列。毕竟前端现在太卷了,框架算是走到「穷途末路」了,无非就是在原有基础上修修补补。所有他们想在...【详细内容】
2024-03-11  Search: Rust  点击:(25)  评论:(0)  加入收藏
前端开始“锈化”?Vue团队开源JS打包工具:基于Rust、速度极快、尤雨溪主导
Vue 团队已正式开源Rolldown —— 基于 Rust 的 JavaScrip 打包工具。Rolldown 是使用 Rust 开发的 Rollup 替代品,它提供与 Rollup 兼容的应用程序接口和插件接口...【详细内容】
2024-03-09  Search: Rust  点击:(17)  评论:(0)  加入收藏
Rust中的数据可视化指南
可视化是数据分析和解释的一个关键方面。虽然Rust主要以其性能和安全特性而闻名,但它也为数据可视化提供了强大的工具。在这个全面的指南中,我们将深入研究Rust中的数据可视化...【详细内容】
2024-03-07  Search: Rust  点击:(31)  评论:(0)  加入收藏
如何在Rust中操作JSON,你学会了吗?
sonic-rs ​还具有一些额外的方法来进行惰性评估和提高速度。例如,如果我们想要一个 JSON​ 字符串文字,我们可以在反序列化时使用 LazyValue​ 类型将其转换为一个仍然带有斜...【详细内容】
2024-02-27  Search: Rust  点击:(47)  评论:(0)  加入收藏
记一次Rust内存泄漏排查之旅
在某次持续压测过程中,我们发现 GreptimeDB 的 Frontend 节点内存即使在请求量平稳的阶段也在持续上涨,直至被 OOM kill。我们判断 Frontend 应该是有内存泄漏了,于是开启了排...【详细内容】
2024-02-27  Search: Rust  点击:(12)  评论:(0)  加入收藏
Rust 最受欢迎的这些库
今天分享主题是,关于一些值得注意的 Rust 库,这些库可以根据它们的功能和在编码中的受欢迎程度进行选择。什么是 Rust 库?在 Rust 中,常被称为 “crate” 的库,是一个打包的单元...【详细内容】
2024-02-19  Search: Rust  点击:(51)  评论:(0)  加入收藏
▌简易百科推荐
微软 Win11 Linux 子系统(WSL)发布 2.2.2 版本
IT之家 4 月 8 日消息,微软近日更新 Windows Subsystem for Linux(WSL),最新 2.2.2 版本中带来了诸多改进,重点更新了 nft 规则,可以让 IPv6 流量通过 Linux 容器。图源: dev.to,AI...【详细内容】
2024-04-08    IT之家  Tags:Linux   点击:(6)  评论:(0)  加入收藏
从原理到实践:深入探索Linux安全机制
Linux 是一种开源的类Unix操作系统内核,由Linus Torvalds在1991年首次发布,其后又衍生出许多不同的发行版(如Ubuntu、Debian、CentOS等)。前言本文将从用户和权限管理、文件系统...【详细内容】
2024-03-27  凡夫编程  微信公众号  Tags:Linux安全   点击:(16)  评论:(0)  加入收藏
在Linux系统中,如何处理内存管理和优化的问题?
本文对 Linux 内存管理和优化的一些高级技巧的详细介绍,通过高级的内存管理技巧,可以帮助系统管理员和开发人员更好地优化 Linux 系统的内存使用情况,提高系统性能和稳定性。在...【详细内容】
2024-03-26  编程技术汇  微信公众号  Tags:Linux   点击:(10)  评论:(0)  加入收藏
Linux 6.9-rc1 内核发布:AMD P-State 首选核心、BH 工作队列
IT之家 3 月 25 日消息,Linus Torvalds 宣布,Linux 6.9 内核的首个 RC(候选发布)版 Linux 6.9-rc1 发布。▲ Linux 6.9-rc1Linus 表示,Linux 内核 6.9 看起来是一个“相当正常”...【详细内容】
2024-03-25    IT之家  Tags:Linux   点击:(12)  评论:(0)  加入收藏
轻松实现Centos系统的软件包安装管理:yum指令实战详解
yum 是一种用于在 CentOS、Red Hat Enterprise Linux (RHEL) 等基于 RPM 的 Linux 发行版上安装、更新和管理软件包的命令行工具。它可以自动解决软件包依赖关系,自动下载并...【详细内容】
2024-02-27  凡夫贬夫  微信公众号  Tags:Centos   点击:(54)  评论:(0)  加入收藏
Win + Ubuntu 缝合怪:第三方开发者推出“Wubuntu”Linux 发行版
IT之家 2 月 26 日消息,一位第三方开发者推出了一款名为“Wubuntu”的缝合怪 Linux 发行版,系统本身基于 Ubuntu,但界面为微软 Windows 11 风格,甚至存在微软 Windows 徽标。据...【详细内容】
2024-02-27    IT之家  Tags:Ubuntu   点击:(50)  评论:(0)  加入收藏
Linux中磁盘和文件系统工作原理解析
在Linux系统中,一切皆文件的概念意味着所有的资源,包括普通文件、目录以及设备文件等,都以文件的形式存在。这种统一的文件系统管理方式使得Linux系统具有高度的灵活性和可扩展...【详细内容】
2024-02-20  王建立    Tags:Linux   点击:(53)  评论:(0)  加入收藏
Linux子系统概览
inux操作系统是一个模块化的系统,由多个子系统组成。这些子系统协同工作,使Linux能够执行各种任务。了解Linux的子系统有助于更好地理解整个操作系统的运作机制。以下是Linux...【详细内容】
2024-02-01    简易百科  Tags:Linux   点击:(77)  评论:(0)  加入收藏
Linux内核:系统之魂与交互之源
内核,作为任何基于Linux的操作系统的心脏,扮演着至关重要的角色。它不仅是计算机系统软件与硬件之间的桥梁,更是确保系统稳定、高效运行的关键。内核提供了一系列核心功能,为上...【详细内容】
2024-02-01  松鼠宝贝    Tags:Linux内核   点击:(69)  评论:(0)  加入收藏
如何确保Linux进程稳定与持久
在Linux系统中,进程的稳定性与持久性对于维持系统的持续运行至关重要。然而,由于各种原因,进程可能会面临崩溃或系统重启的情况。为了确保关键进程能够持续运行,我们必须采取一...【详细内容】
2024-01-19  松鼠宝贝    Tags:Linux进程   点击:(85)  评论:(0)  加入收藏
站内最新
站内热门
站内头条