0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux 内核对Rust的支持可能涉及到的三个方面

如意 来源:开源中国 作者:xplanet 2020-09-04 10:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

从去年九月,Linux 内核维护者 Greg 表示愿意接受用 Rust 开发 Linux 驱动,到今年七月,Linus Torvalds 回应称可以默认启用 Rust 支持,Linux 开发者并非只是说说而已。

在八月底举办的 2020 Linux Plumbers 大会上,关于 Linux 内核上游对 Rust 的开放程度成为了最热门的讨论话题。Rust 语言团队的联合负责人 Thomas 和 Gaynor,以及 Linux 内核开发者 Josh Triplett 等人参与了这场讨论,并向大家展示了截至目前的一些研究成果、想法,还有遇到的问题。

他们强调,并不打算将已有的内核改写成 Rust,而只专注于可以用 Rust 编写的新代码。具体来讲,与会者集中讨论了 Linux 内核对 Rust 的支持可能涉及到的三个方面:内核中现有的 API、架构支持,和 ABI 与内核的兼容性问题。

绑定到现有的 C API

目前来看,Rust 能够生成可以链接到内核的代码还不够。它还需要一种方法来访问 Linux 内核中使用的大量 API,这些 API 目前都在 C 头文件中定义。

Linux 内核开发者指出,Rust 与 C 具有良好的互操作性;此外,bindgen 工具能够解析 C 头文件以生成适当的 Rust 声明,因此 Rust 不需要从 C 复制重复的定义,这也提供了一种跨语言类型检查的措施。

从表面上看,这些特性使 Rust 具备了与现有 C API 集成的良好条件,但实际上实施起来还存在一些挑战。例如,Linux 大量使用了预处理器宏和内联函数,bindgen 和 Rust 的外函数接口不容易支持它们。

有关 API 绑定的第二个问题是:需要手动封装多少 C API 才能呈现惯用的 Rust 接口

Thomas 和 Gaynor 展示了一个 linux-kernel-module-rust 项目,可在其中看到内核模式的 Rust 代码示例。在这个项目中,指向用户空间的指针被封装到 UserSlicePtr 类型中。这样的封装生成的代码对现有 Rust 开发者而言更加熟悉,并使 Rust 的类型系统和借用检查器提供最大程度的安全性。但是,必须针对每个 API 进行设计和开发,用 C 和 Rust 编写的模块也会创建不同的 API。这无疑加重了工作的繁琐度。

John Baublitz 也给出了一个演示模块,它更直接地绑定了内核的用户访问功能,绑定多由 bindgen 自动生成。然而,Rust 开发者对这些代码可能会不太习惯,并且这种方式可能需要放弃 Rust 的许多安全保证。

最后,会议达成了共识:对于某些最常见和关键的 API,编写 Rust 封装器是有意义的,但是手动封装每个内核 API 不可行。Thomas 还提到谷歌正致力于自动生成 C++ 代码的惯用绑定,并考虑内核是否可以做类似的事情。

架构支持

对架构的支持是讨论的另一个重点。与会者表示,在 Rust 中实现 Linux 驱动是可以接受的,但无论如何不能把它放在更晦涩难懂的架构上。

在这方面,现阶段唯一成熟的 Rust 实现是 rustc 编译器,该编译器通过 LLVM 发出代码。Linux 内核支持多种架构,其中一些没有可用的 LLVM 后端,另一些存在 LLVM 后端,却尚不受 rustc 支持。

Triplett 认为,先将 Rust 添加到 Linux 内核中,反过来会有助于增加对更多架构的 Rust 支持。就像 Rust 软件被引入 Debian 后,吸引了更多不同架构的爱好者协助改进 Rust 支持一样,他寄希望于为 Linux 内核添加 Rust 支持也获得类似的效果。

ABI 与内核的兼容性

Gaynor 问到了有关 ABI 兼容性的建议。当前 Rust 是通过 LLVM 编译的,而 Linux 内核通常使用 GCC 构建,因此将 Rust 代码链接到内核可能意味着混合 GCC 和 LLVM 发出的代码。

参与讨论者担心 LLVM 与 GCC 可能会有 ABI 兼容的问题,于是提出一个设想,即 Linux 内核社区是否可以将 Rust 支持仅限于使用 Clang 构建的内核,以确保兼容性。

Linux 内核维护者 Greg 指出,当前的内核规则是,仅当内核中的所有目标文件使用相同的编译器并使用相同的标志构建时,才能保证兼容性。不过,他仍然对将 LLVM 构建的 Rust 对象链接到 GCC 构建的内核表示满意,因为只要配置适当,并通过测试即可。他认为不需要任何预先的限制,直到真正有实际问题产生。

另一位内核开发者 Triplett 也强调,GCC 和 Rust 之间的调用是常规且普遍的,不必担心兼容性。因此目前看来,二者的兼容性问题目前不会成为将 Rust 引入 Linux 内核的阻碍。

这场会议上的讨论大致到此,暂时没有后续消息。随着越来越多的人对此抱有期待和热情,正如 LWN.net 所说,或许待一个具体的 Rust 内核驱动用例出现时,所有的争议和决策都将变得更加清晰。
责编AJX

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11814

    浏览量

    219527
  • API
    API
    +关注

    关注

    2

    文章

    2474

    浏览量

    67004
  • Rust
    +关注

    关注

    1

    文章

    241

    浏览量

    7649
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux系统中这三个命令的完整功能和正确查看方法

    Linux 系统的日常运维中,监控进程资源使用情况是最频繁的工作之一。当服务器 CPU 突然飙高、内存告警、或者业务响应变慢时,运维工程师首先要做的事情就是查看系统资源使用状况。top、ps、free 这三个命令几乎是每个运维人员每天都要敲几十遍的工具。
    的头像 发表于 04-21 11:45 158次阅读

    如何理解Linux内核中的PCIe驱动

    各异的芯片组,加上各种 PCI 设备自身独特的功能需求,Linux 内核中的 PCI 支持远比我们希望的要复杂得多。今天这篇文章,我们将从驱动开发的视角,梳理 Linux PCI 设备
    的头像 发表于 04-11 17:22 1254次阅读

    Perforce 静态分析现已正式支持 Rust语言!

    您是否正计划通过 Rust 编程来提升内存安全性,却又担心它无法覆盖所有的安全漏洞?Perforce QAC 和 Klocwork 现在已支持分析 Rust 代码,填补了开源代码检查工具在质量和治理工具链
    的头像 发表于 04-08 15:38 438次阅读
    Perforce 静态分析现已正式<b class='flag-5'>支持</b> <b class='flag-5'>Rust</b>语言!

    Linux内核驱动开发的技术核心精要

    开发中必须理解的技术要点,供从业者参考。 一、并发与同步:多核系统的根基 现代内核默认支持SMP(对称多处理),驱动代码可能同时运行在多个CPU核、中断、软中断、抢占路径上,竞态风险无处不在。
    发表于 03-10 13:56

    进迭时空 Upstream | K3 获得 Linux 7.0 内核原生支持

    款符合RVA23规范的RISC-V量产芯片,成功获得Linux内核主线原生支持。01.战略先行:对标一流,确立“Pre-siliconUpstream”目标早在K
    的头像 发表于 02-27 18:10 1.2w次阅读
    进迭时空 Upstream | K3 获得 <b class='flag-5'>Linux</b> 7.0 <b class='flag-5'>内核</b>原生<b class='flag-5'>支持</b>

    Linux内核的“心跳”:jiffies如何为系统计时?

    Linux 内核的世界里,有一默默工作的 "计时器"——jiffies。它不像我们手机上的时钟那样显示年月日,却掌控着内核中绝大多数时间相关的操作:从进程调度
    的头像 发表于 02-04 16:27 929次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>的“心跳”:jiffies如何为系统计时?

    三个经典开关电源实际问题解析

    下面三个关于多路输出电源连续工作模式的问题,测试一下您的电源设计知识。然后核对您的答案。
    的头像 发表于 01-22 16:08 3410次阅读
    <b class='flag-5'>三个</b>经典开关电源实际问题解析

    RusT-Thread:基于Rust面向资源受限嵌入式设备的操作系统的实践 | 技术集结

    RT-Thread为基础,使用Rust语言重构其内核,形成了全新的RusT-Thread系统。系统采用模块化架构,涵盖内核服务、进程调度、内存管理、线程通信与时钟控制等核心
    的头像 发表于 11-07 17:37 7052次阅读
    <b class='flag-5'>RusT</b>-Thread:基于<b class='flag-5'>Rust</b>面向资源受限嵌入式设备的操作系统的实践 | 技术集结

    Linux 编程语言盘点:从内核AI的全栈选择

    在工控圈和嵌入式圈里,有一常年被讨论的问题:  “在 Linux 上,到底该用什么语言编程?” 有人坚信:C 才是真正的工业语言。有人反驳:Python 才是效率王者。还有人推崇 Go、Rust
    的头像 发表于 11-06 17:05 776次阅读

    【「Yocto项目实战教程:高效定制嵌入式Linux系统」阅读体验】+基础概念学习理解

    指导。 、读后感 这本书内容丰富且实用,完全可以当作我的工具书。当项目中涉及到相关知识时,我能够快速从中找到常用的知识点,为解决实际问题提供有力的支持
    发表于 08-04 22:29

    RT-Thread 遇上 Rust:安全内核 RusT-Thread 的诞生

    大家好,我们是中国科学技术大学操作系统原理与设计(H)课oooooS小组。这个项目是我们的课程大作业:参考RT-Thread架构,使用Rust搭建一原生的嵌入式操作系统内核。初识Rust
    的头像 发表于 08-02 11:03 3712次阅读
    RT-Thread 遇上 <b class='flag-5'>Rust</b>:安全<b class='flag-5'>内核</b> <b class='flag-5'>RusT</b>-Thread 的诞生

    一文读懂:嵌入式Linux实时性进阶

    Linux内核才能得到运行的机会。 4两的性能对比 ✅实时性: PREEMPT_RT:提供了较好的软实时性能,通过减少内核对任务执行的干扰,提供可预测的实时性能。然而,在
    发表于 07-10 15:26

    怎么结合嵌入式,Linux,和FPGA三个方向达到一均衡发展?

    在嵌入式领域,不少人都怀揣着让嵌入式、Linux 和 FPGA 三个方向实现均衡发展的梦想,然而实践中却面临诸多挑战。就像备受瞩目的全栈工程师稚晖君,他从大学玩单片机起步,凭借将智能算法融入嵌入式而
    的头像 发表于 06-25 10:08 1018次阅读
    怎么结合嵌入式,<b class='flag-5'>Linux</b>,和FPGA<b class='flag-5'>三个</b>方向达到一<b class='flag-5'>个</b>均衡发展?

    请问OpenVINO™ 是否支持 Rust 绑定?

    无法确定OpenVINO™是否支持 Rust 绑定。
    发表于 06-25 07:45

    CYW55513是否支持linux4.4?

    开始支持55513的驱动版本是Infineon Linux Wi-Fi驱动程序(FMAC)(v2024_1115) 但在发行说明中有一句话 从内核版本 4.14
    发表于 06-05 07:26