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
    +关注

    关注

    87

    文章

    11222

    浏览量

    208883
  • API
    API
    +关注

    关注

    2

    文章

    1484

    浏览量

    61803
  • Rust
    +关注

    关注

    1

    文章

    228

    浏览量

    6567
收藏 人收藏

    评论

    相关推荐

    Linux应用编程的基本概念

    Linux应用编程涉及到Linux环境下开发和运行应用程序的一系列概念。以下是一些涵盖Linux应用编程的基本概念。
    的头像 发表于 10-24 17:19 180次阅读

    机械振动的三个基本要素

    机械振动是物体或质点在其平衡位置附近进行的往复运动。在物理学中,机械振动是一种非常普遍的现象,它涉及到许多不同的物理过程和应用。机械振动的三个基本要素是:振幅、周期和频率。 1. 振幅
    的头像 发表于 09-26 14:55 523次阅读

    如何用Rust编写一ChatGPT桌面应用(保姆级教程)

    官方网站 并遵循说明来安装。 安装 Rust 插件:打开 IntelliJ IDEA,然后转到 "File" > "Settings" (Windows/Linux) 或
    的头像 发表于 09-25 11:19 290次阅读
    如何用<b class='flag-5'>Rust</b>编写一<b class='flag-5'>个</b>ChatGPT桌面应用(保姆级教程)

    对称相电压的特点是哪三个方面

    对称相电压是电力系统中常见的一种电压形式,它具有三个相位,每个相位之间的相位差为120度。对称相电压在工业生产和日常生活中有着广泛的应用,如电动机、变压器、发电机等。本文将从三个
    的头像 发表于 08-12 18:18 917次阅读

    未来嵌入式系统的黄金搭档 MCX N947遇上Rust

      Rust 介绍 Rust 是一门注重安全的语言,相比于 C/C++/ASM 有着更高级的抽象能力、编译器带来的安全特性与广泛友好的社区支持Linux 与 Windows
    的头像 发表于 07-25 09:14 1290次阅读
    未来嵌入式系统的黄金搭档 MCX N947遇上<b class='flag-5'>Rust</b>

    模拟信号的数字化过程包括三个步骤

    模拟信号的数字化是现代通信和信息处理的基础,它涉及到将连续的模拟信号转换为离散的数字信号,以便于计算机和其他数字设备进行处理和存储。这个过程包括三个主要步骤:采样、量化和编码。下面我们将讨论这三个
    的头像 发表于 07-11 15:20 1537次阅读

    建立神经网络模型的三个步骤

    建立神经网络模型是一复杂的过程,涉及到多个步骤和细节。以下是对建立神经网络模型的三个主要步骤的介绍: 第一步:数据准备 1.1 数据收集 数据是神经网络的基础。首先,你需要收集足够的数据来训练
    的头像 发表于 07-02 11:20 701次阅读

    微波测量的三个基本参量是什么

    微波测量是电子工程领域中的一重要分支,它涉及到对微波信号的频率、幅度、相位等参数的测量。在微波测量中,有三个基本参量:频率、幅度和相位。这三个参量是微波信号的基本特征,对于微波系统的
    的头像 发表于 05-28 14:46 1152次阅读

    Linux 6.10集成RISC-V更新,支持Rust编程语言

    本次补丁升级中,Linux内核进一步扩展了对应于RISC-V架构的Rust编程语言支持。在此之前,Rust已可应用在x86_64、龙芯Loo
    的头像 发表于 05-23 17:16 897次阅读

    微软发布Linux内核Rust模块优化补丁

    在此之前,Linux 内核中要想实现模块初始化,必须先创建一实例,再将其移至特定内存空间。然而,经过新补丁调整后,各模块可直接在预设定好的内存地址上完成初始化工作。
    的头像 发表于 04-02 15:11 435次阅读

    求助,请问一结构体如何全部定义 __attribute__ 区域?

    请问一结构体如何全部定义 __attribute__ 区域? 例如我这里涉及到一些高速计算的缓存,计划将缓存数据存储 __attribute__ 区域。
    发表于 01-16 07:29

    rk3399移植Linux内核

    RK3399是一款由中国厂商瑞芯微推出的高性能处理器芯片,被广泛用于嵌入式系统开发。在进行应用程序开发之前,我们需要将Linux内核移植RK3399上,以支持硬件的驱动和功能。本文将
    的头像 发表于 01-08 09:56 1042次阅读

    Linux内核内存管理架构解析

    内存管理子系统可能linux内核中最为复杂的一子系统,其支持的功能需求众多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面
    的头像 发表于 01-04 09:24 631次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>内存管理架构解析

    Linux 6.8主线内核支持骁龙8 Gen 3,但仍需额外适配

     Linux 6.8主线内核对高通骁龙8 Gen 3的支持将为开发人员和用户带来更多的选择和便利。无需额外的适配工作,Linux操作系统将能够在搭载该芯片的设备上运行。
    的头像 发表于 12-19 15:46 1701次阅读

    linux关机的三个命令

    Linux系统中,常用的关机命令有三个:shutdown、poweroff和halt。下面是对这三个命令的详细解释: shutdown命令 shutdown命令用于在指定的时间或条件下关闭计算机
    的头像 发表于 11-26 15:33 2829次阅读