LWN:6.2内核中的Rust!

基于知识图谱的电影推荐系统——Neo4j&Python 也可直接从这里下载:链接: https://pan.baidu.com/s/1l6wjwcUzy5G_dIlVDbCkpw 提取码: pkq6。修改main.py中的driver,输入自己数据库的用户名与密码。系统会询问是否需要重新加载并创建知识图谱,在第一次时输入1。 阅读详情

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

Rust in the 6.2 kernel

By Jonathan Corbet
November 17, 2022
DeepL assisted translation
https://lwn.net/Articles/914458/

6.1 版本的合并窗口带来了对用 Rust 编写内核代码的基本支持,这里的关键词是 "基本"。在 6.1 版本中可以创建一个 "hello world" module,但除此之外没有更多的可以做了。其实还有很多 Rust 代码在等待 review 以及合并到 mainline 上。Miguel Ojeda 现在已经发布了下一轮的 Rust patch,用来增加内核中的架构支持代码。

这 28 个 patch 专注于底层支持代码,它们仍然没有创建太多抽象来处理内核的其他部分。基于这些 patch,不会有新的亮眼的驱动程序。但是它确实是朝着给 Linux 内核的代码开发创造又一个可用环境所迈出的又一步。

作为 Rust 初始支持来举一个例子,由于内核有八个不同的日志级别(logging levels),从 "debug" 一直到 "emergency" 级别。每个级别都有一个宏定义用来让 print 更加方便。例如,如果即将发生 crash 了,就用 pr_emerg() 来大声地叫出来。6.1 中的 Rust 代码里定义了相应的宏,但只有两个:pr_info!()和 pr_emerg!();其他的日志级别的相关的宏都没有加。6.2 的首要任务似乎是填补其余的那些,也就是从 pr_debug!()这个极端到 pr_alert!()的另一个极端。还有 pr_cont!()用于处理由多次调用所拼凑起来的信息打印。这个内核模块的例子(https://lwn.net/ml/linux-kernel/20221110164152.26136-5-ojeda@kernel.org/)展示了所有的 print 宏的作用。

这组 patch 中所增加的一个比较复杂的宏是#[vtable]。内核大量使用了包括许多函数指针的结构;这些结构是内核对象模型的核心。一个典型的例子就是 struct file_operations,其中包含了对一个已经打开的文件可以做的各种动作的实现函数。从相对容易理解的操作如 read()和 write(),一直到更难理解的功能如 setlease()或 remap_file_range()。内核中任何可以表示为已经打开了的文件的对象都会提供这样的一个结构来实现对该文件的操作。

因此,像 file_operations 这样的操作结构看起来很像 Rust traits,而且它们确实可以在 Rust 代码中用 traits 的方式来实现。但是内核允许一个这样的结构中都不用定义那些用不到的函数;例如,remap_file_range()操作在大多数设备驱动中都是没有意义的。在内核的 C 代码中,这些缺失的操作就用一个空指针来表示;调用这些操作的代码都会检测到有空指针,从而转为执行一个默认的操作。然而,空指针是 Rust 世界要避免的东西,所以在 Rust 需要做一些额外工作才能真正表达 operation structure。

#[vtable]宏就是用来完成 C operation structure 和 Rust traits 之间必须进行的适配的。在 trait 声明和实现的时候都将使用这个宏,所以 trait 的定义就类似下面这样:

#[vtable]
pub trait Operations {
    /// Corresponds to the `open` function pointer in `struct file_operations`.
  fn open(context: &Self::OpenData, file: &File) -> Result<Self::Data>;
// ...
}

而一个具体设备的实现就类似下面这样:

#[vtable]
  impl kernel::file::Operations for some_driver {
      fn open(_data: &(), _file: &File) -> Result {
          Ok(())
      }
// ...
  }

如果要把这个实现递给内核的其他部分,那么就必须转化为合适的 C structure。Rust 可以创建这个结构,但是它很难检测出哪些操作是已经实现了的,以及哪些操作应该用一个空指针来表示。#[vtable] 宏有助于为每个定义了函数都生成一个专门的 constant member;在上面的例子中,some_driver 类型就会有一个常量 HAS_OPEN 成员,被设置为 true。生成 C operation structure 的代码可以查询这些常量(在编译时),并为 missing operation 插入空指针;可以从相关 patch 中了解到这里的工作细节。

为 6.2 提交的 patch 中增加了#[vtable],但并没有包含任何使用了它的地方。对此感兴趣的人可以通过查看 8 月份发布的这个巨大的 patch 来了解如何使用它;搜索#[vtable]和 HAS_就能找到使用这一基础设施的地方。

另一个新增的宏是 declare_err!(),它可以用来声明各种错误代码常量,如 EPERM。6.2 版本的内核可能会包括一整套用这个宏来声明的错误代码,而不是 6.1 版本中所实现的一个最小集合。还有一种机制可以将许多 Rust 内部的错误翻译成 Linux 的错误代码。

Rust Vec 类型实现了一个数组,它可以根据需要增长,从而放入更多内容。当然,增加 size 的时候就涉及到内存分配,这在内核中可能会失败。在 6.2 中,在内核中实现的 Vec 可能会有两个 method,分别叫做 try_with_capacity()和 try_with_capacity_in()。它们的作用与标准的 with_capacity()和 with_capacity_in() Vec method 类似,会预先分配内存从而方便后续存放数据,但有所不同的是,它们可以返回一个失败代码。try_ 变体的 method 会允许内核代码尝试分配所需大小的 Vec,并在分配失败时正确处理,而不是像标准版本的函数那样直接调用 panic()。

对于像编者这样的新手来说,Rust 的一个更令人困惑的方面是存在两种 string 类型:str 和 String;前者表示对存储在其他地方的字符串的一个 borrowed reference,而后者实际上拥有该字符串。内核的 Rust 支持将相应地定义两个变体,称为 CStr 和 CString,它们的功能与 C 语言的 string 相同。具体来说,它们处理的是一个表示为字节数组的字符串,并以 NUL 字符结束。将字符串传递给内核其他部分的 Rust 代码都会需要使用这些类型。

这组 patch 中最后实现了一些随机的组件,它们对未来新增更多 Rust 功能会是必要的。dbg!()宏使某些类型的调试更容易。有一些代码是支持 compile-time assertion 以及强制 build error 的。Either 类型可以容纳一个可以是两种不同类型中的一种的一个对象。最后,Opaque 类型是用于内核使用、但是 Rust 代码从不访问的那些结构。使用这种类型可以提高性能,因为在调用初始化函数之前,不需要对存放它的内存初始化为零。

可以看出,这些 patch 正在慢慢地构建起内核内的 Rust 代码,以备于今后可以在 Rust 中实现一些真正有用的功能,但这个过程还没有完成。目前还不清楚是否会有更多的 Rust 代码被推荐到 6.2 中,还是说这已经是 6.2 中计划合入的全部内容了。对于那些想开始用 Rust 做真正工作的开发者来说,这种进展速度可能显得很慢,但它确实有一个优势,那就是可以递进式地让内核社区理解以及 review。Rust-for-Linux 的工作已经进行了几年;要达到完整的功能可能还需要一段时间。

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

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

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

format,png

PCB仿真软件:Altium Designer_(15).AltiumDesigner的版本控制与项目管理 在进行PCB设计时,版本控制和项目管理是确保设计质量和团队协作效率的关键。Altium Designer 提供了强大的版本控制和项目管理功能,可以帮助设计团队更好地管理和维护项目。本节将详细介绍如何在Altium Designer中进行版本控制和项目管理,包括如何使用版本控制系统、如何管理项目文件、如何进行团队协作等。 阅读详情

相关推荐

5G 网络的移动性管理上下文对比介绍

5G 网络的移动性管理上下文对比介绍 4G/5G MM移动性管理机制对比 5G引入了新移动性管理状态,通过mobility pattern(移动方式)实现按需的移动性管理等。 MM的相关状态分为一下几种: RM状态(用户注册管理 注册态/非注册态)和CM状态(用户连接态/空闲态)独立;RM状态标识UE是否注册到网络,CM状态标识UE和核心网的信令连接是否存在。 RAN侧引入RRC-inactive state:UE(用户端)对于CN(核心网)而言处于连接态,对RAN(接入网)而言处于Ld..

m0_59032675的博客 4818

Rust 1.7.0 语法基础 attribute

一、语法attribute : '#' '!' ? '[' meta_item ']' ; meta_item : ident [ '=' literal | '(' meta_seq ')' ] ? ; meta_seq : meta_item [ ',' meta_seq ] ? ;二、说明使用Java的人都知道,Java有个 annotation 注解。 Rust 也有注释,名称和C#的

王洪伟的专栏 9161

车辆动力学从入门到进阶之路(传统篇)

新手如何入门车辆动力学开发领域,本文为您引路!

CrazyRabbit的博客 1万+

Rust for Linux:世界上最大的软件项目的内存安全问题有办法了!

Rust 成为Linux 内核第二官方语言,原是为了解决内存安全问题!

开源吞噬世界。 5974

cutlass2.x源码解读之PitchLinearStripminedThreadMap

TensorCoord:使用layout::PitchLinearCoord作为张量坐标。Shape:使用模板参数Shape_作为tile的形状,kThreads:线程总数,定义为模板参数Threads。kElementsPerAccess:每次访问的元素数,定义为模板参数ElementsPerAccess。ThreadAccessShape:线程访问的形状,使用layout::PitchLinearShape定义。内部实现细节:ShapeVec。

jiangjkd的专栏 786

有史以来最小的GIF/png/jpg/jpeg

昨天我对图像进行了 base64 编码,这样我就可以将它发送到 CouchDB 以测试我正在为客户编写的一些代码。它让我想起了我之前在远程服务器上设置 cookie 时所做的事情。基本上,一个小的 PHP 脚本被放在远程服务器上,它接受几个 GET 参数并根据它们的值设置一些 cookie。然后脚本输出一个 1x1 的透明 GIF。本地服务器上的 PHP 脚本生成了一个 IMG 标签,该标签链接到该图像并根据本地服务器上的 COOKIES 设置参数。

凌凌1301的博客 1416

探索 Rust for Linux:更安全、更快捷的内核编程新时代

探索 Rust for Linux:更安全、更快捷的内核编程新时代 去发现同类优质开源项目:https://gitcode.com/ 项目简介 是一个致力于将 Google 开发的系统级编程语言 Rust 引入 Linux 内核开发的项目。其目标是利用 Rust 的安全性特性,降低 Linux 内核的内存错误和漏洞风险,提高系统的稳定性和可靠性。 技术分析 Rust 以其强大的类型系统、所有权模型...

gitblog_00089的博客 881

文献解读:结构方程模型SEM基础,小白看这个就基本够了

今天要解读的依然是一篇教学文献:The Basics of Structural Equation Modeling,文献作者是Diana Suhr, Ph.D. University of Northern Colorado。 文献链接: https://www.lexjansen.com/wuss/2006/tutorials/TUT-Suhr.pdf 结构方程模型是: 用来检验显变量与潜变量关系假设的综合性的统计技巧 用来表示,估计或者检验变量间理论关系的技巧 用来探究一系列潜变量和显变量因

Codewar的博客 6万+

Rust for Linux 源码导读 | Ref 引用计数容器 原创

引子 2022 年,我们很可能会看到 Linux 内核中的实验性 Rust 编程语言支持成为主流。2021.12.6 早上发出了更新的补丁,介绍了在内核中处理 Rust 的初始支持和基础设施。 这次更新的内容包括: 升级到了最新 Stable 编译器和 Rust 2021 edition 。因此可以摆脱了 const_fn_transmute,const_panic、const_unreachable_unchecked、core_panic 和try_reserve 这几个之前未稳定的特性。 自定义 co

CRMEB小程序商城的博客 1127

优化dalsa相机检测界面

上节实现了使用qt结合dalsa相机显示检测到缺陷的画面,由于窗口过于简陋,本节将进行一个界面优化。

A1983Z的博客 986

用 OP-TEE 给 AI 模型“上锁”:密文存储、TEE 解密放行、推理后销毁(实战可落地)

本文提出一种基于OP-TEE的AI模型保护方案,通过两级密钥体系确保模型静态存储为密文,运行时仅在TEE内解密。方案采用KEK+DEK架构,DEK永不出TEE,支持分块解密与可验证擦除。该方案能有效防御静态分析、应用层逆向等威胁,但需承认其物理级攻击的局限性。文章详细描述了端到端架构、文件格式设计及TA实现要点,包括密钥管理、分块解密策略和销毁机制,为设备侧AI部署提供了工程可行的安全解决方案。

Interview_TC的博客 288

编译rust for linux内核源码(5.16.0-rc3)

本文针对rust for linux内核源码进行编译,跟主线版本的linux编译稍有不同,因为引入了rust,编译rust需要安装相关工具,以下部分会详细介绍如何编译rust for linux。 ​

weixin_42915431的博客 4172

Qt(C++)使用QChart动态显示3个设备的温度变化曲线

Qt的QChart是一个用于绘制图表和可视化数据的类。提供了一个灵活的、可扩展的、跨平台的图表绘制解决方案,可以用于各种应用程序,如数据分析、科学计算、金融交易等。

1916

LWN:初识6.1内核中的Rust!

关注了就能看到更多这么棒的文章哦~A first look at Rust in the 6.1 kernelBy Jonathan CorbetOctober 13, 2022DeepL assisted translationhttps://lwn.net/Articles/910762/在 6.1 版本中有很多重要的改动被合并到 mainline 了,但是其中一个最受关注的改动,对内核用户的...

Linux News搬运工 858

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LWN:企业内核使用Rust!

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

Linux News搬运工 1874

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

Rust语言学习交流 1063

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

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

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

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

Linux News搬运工 671

LWN:对2024所做预测的回顾!

关注了就能看到更多这么棒的文章哦~A 2024 retrospectiveBy Jonathan CorbetDecember 25, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/1002368/通常人们说的疯狂(insanity),就是重复同样的行为却期待不同的结果。尽管如此,LWN 每年年初都会进行一组预测,然后在年末不得不...

Linux News搬运工 955

LWN:内核unsafe Rust使用标准!

关注了就能看到更多这么棒的文章哦~Standards for use of unsafe Rust in the kernelBy Daroc AldenAugust 14, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/982868/Rust 被设计来帮助程序员编写更安全的代码。但是,编译器并非无所不知的,编写与硬件交互(或在 ...

Linux News搬运工 2081

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

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

Linux News搬运工 1659

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:学习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

LWN: Linux kernel 中的Rust!

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

Linux News搬运工 838

LWN:内核维护者们对Rust-for-Linux的观点!

关注了就能看到更多这么棒的文章哦~Maintainer opinions on Rust-for-LinuxBy Daroc AldenFebruary 10, 2025FOSDEMGemini-1.5-flash translationhttps://lwn.net/Articles/1007921/Miguel Ojeda 在FOSDEM 2025大会上的一次主题演讲中,介绍了Rust...

Linux News搬运工 1129

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:LWN 在招聘!

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

Linux News搬运工 393
上一篇: LWN:扩展KVM社区!
下一篇: LWN:避免过量oops!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值