使用Rust进行Linux kernel开发,可以试一试!

嵌入式资讯精选 2021-03-31 00:00

长期以来,Rust 编程语言的一个目标都是能替代在操作系统内核开发中最常用的 C 语言。随着 Rust 的逐步成熟,许多开发人员越来越有兴趣在 Linux 内核中尝试 Rust。在 2020 (virtual) Linux Plumbers Conference 会议上,LLVM 这个微会议的诸多议题中就举办了一场讨论,关于 Linux 内核中接受 Rust 代码还有那些未解决的问题或者障碍。这是 2020 年活动中参加人数最多的一次会议,从中可以看出人们对这个议题有多么感兴趣了。

这个会议之前已经有许多开发者做了不少工作了,包括去年 Alex Gaynor 和 Geoffrey Thomas在 Linux Security Summit 安全峰会上的一次演讲。当时,他们介绍了 Rust 内核模块的一个原型,并提出了在内核中采用 Rust 的理由。他们的重点是在安全问题上,指出在 Android 和 Ubuntu 中,约有三分之二的内核漏洞被分配到 CVE 中,这些漏洞都是来自于内存安全问题。原则上,Rust 可以通过其 type system 和 borrow checker 所提供的更安全的 API 来完全避免这类错误。

此后,Linus Torvalds 和其他核心内核维护者都表示原则上对支持 Rust 的内核开发持开放态度,因此 Plumbers 的会议旨在列出具体能让 Rust 进入 Linux kernel 的一些要求。这次会议是在 linux-kernel 邮件列表上提出并讨论的,当时就已经提出了一部分讨论主题。

这次会议的主角也是 Thomas 和 Gaynor,还有 Josh Triplett——Rust 语言团队的联合领导者,也是一位长期从事 Linux 内核开发的人——以及其他一些对此感兴趣的开发者。他们简单地谈了一下他们到目前为止的工作,以及他们最初的一些想法和问题,然后的大部分时间进行讨论。他们举了一个简单的例子,说明内核模式的 Rust 代码可能是什么样的(来自 Thomas 和 Gaynor 的 linux-kernel-module-rust 项目,https://github.com/fishinabarrel/linux-kernel-module-rust/)。

发言者强调,他们并不是提议将 Linux 内核重写成 Rust,他们只是关注于走向一个可以用 Rust 编写新代码的世界。接下来的对话集中在 Rust 支持的三个潜在关注点上:利用内核中现有的 API,架构支持,以及关于 Rust 和 C 之间 ABI 兼容性的问题。

对现有 C API 的绑定(Binding to existing C APIs)

要想对内核开发能有实际价值的话,Rust 如果只是能够生成可以链接到内核的代码,这是不够的,还需要有一种方法让 Rust 能够访问 Linux 内核中在使用的大量 API,目前这些 API 都是在 C 头文件中定义的。Rust 对与 C 代码的互操作有很好的支持,包括既支持使用 C ABI 调用函数,也支持定义与 C 兼容的 ABI 的函数,这些函数可以由 C 语言中调用。此外,bindgen 工具能够解析 C 头文件,生成相应的 Rust 声明,这样 Rust 就不需要从 C 中重复定义,这也提供了一定程度的跨语言类型检查。

从表面上看,这些特性使 Rust 具备了与现有 C API 集成的能力,但魔鬼就在细节中,迄今为止的工作和会议上的对话都说明这里实现中有不少的挑战。例如,Linux 大量使用预处理宏(preprocessor macro)和内联函数(inline function),而这些函数并不容易被 bindgen 和 Rust 的 foreign-function interface 接口所支持。

例如,非常常用的 kmalloc() 函数就被定义为 __always_inline,这意味着它的所有调用都是 inline 的,内核符号表中没有 kmalloc() 符号, Rust 也就无法进行链接调用。这个问题可以很容易地解决,我们可以定义一个包含非 inline 版本的 kmalloc_for_rust() 符号,但是手工处理这些变通解决方案会导致大量的手工工作和重复的代码。这项工作有可能通过改进版的 bindgen 自动完成,但目前工具还不具备这个功能。

对话中还提到了第二个关于 API 绑定的问题:C API 需要进行多大程度的手动 "wrapped(包装)"才能提供出地道的 Rust 接口?看看现有的两个 Rust 内核模块项目,就能体会到这里的一些麻烦。

在 linux-kernel-module-rust 项目中,进入用户空间的指针被 wrap 成 UserSlicePtr 类型,这确保了 copy_to_user()或 copy_from_user()的可以正确使用。这个 wrapper 在 Rust 代码中提供了一定程度的安全性功能(因为这类指针不能直接 dereference),同时也使 Rust 代码更加地道。要想写入用户空间指针的话,代码看起来就像是这样:

user_buf.write(&kernel_buffer)?

这里的"?"是 Rust 错误处理机制的一部分,这种 return and handling error 的处理风格在 Rust 中无处不在。这类 wrapper 使现有的 Rust 开发者更加熟悉所产生的 Rust,并使 Rust 的 type system 和 borrow checker 能够尽量确保安全。然而,每一个 API 都需要这样的精心设计和开发,工作量巨大,也会导致 C 和 Rust 编写的模块有不同的 API。

John Baublitz 的 demo module(https://github.com/jbaublitz/knock-out ),则是直接地绑定了内核的用户访问函数。相应的代码看起来是这样的:

if kernel::copy_to_user(buf, &kernel_buffer[0...count]) != 0 {
return -kernel::EFAULT;
}

这种改法实现起来很容易,binding 主要是由 bindgen 自动生成的,而且对于现有的内核开发者来说,他们也会不那么排斥 review 或者修改 Rust 代码。然而,对于 Rust 开发者来说,这种代码就不那么习惯了,而且可能会损失 Rust 原本可以保证的一些安全性。

会议上大家一致认为,对于一些最常见的关键 API,有必要编写 Rust 版本的 wrapper,但不可能对每一个内核 API 都手动去写一个 wrapper,这是不可取的做法。Thomas 提到 Google 正在研究自动生成 C++代码的规范化绑定动作,不知道内核是否可以做一些类似的事情,也许是建立在现有的 sparse annotation(kernel 中使用的语义检查工具)基础之上,或者是在现有的 C 代码中添加一些新的注释来引导 binding generator 的工作。

架构支持(Architecture support)

下一个讨论话题是架构支持。目前,唯一成熟 Rust 编译器只有 rustc 这一个,它是通过 LLVM 来生成指令码。Linux 内核支持许多种体系架构,其中一些架构并没有现成的 LLVM 后端(backend)。其他一些架构存在 LLVM 后端,但 rustc 还尚未不支持该后端。演讲者想知道,全架构支持是否是在内核中启用 Rust 的一个障碍。

有几个人说,在 Rust 中实现驱动是可以接受的,但无论如何,这些驱动永远不会用在比较少见的架构上。Triplett 以他在 Debian 项目中的经验为例,认为在内核中加入 Rust 将有助于推动更多架构对 Rust 的支持。他提到,将 Rust 软件引入 Debian 有助于激励小众架构的爱好者和用户提高对 Rust 的支持,他认为在内核中加入 Rust 后也会有类似的效果。尤其是,任何具有 LLVM 后端的架构预计都可以很快得到 rustc 的支持。

对话中也提及了还有其他一些可选的 Rust 实现版本,这样可以有助于支持更多的架构。mrustc 项目就是一个实验性的 Rust 编译器,它可以生成 C 代码。使用 mrustc 有可能可以让 Rust 通过编译内核其他部分所用的那个 C 编译器来编译。

此外,Triplett 还提到了一些针对 GCC 的 Rust 前端(front end)的工作,这些工作有可能使 Rust 能够支持 GCC 所支持的任一架构。这个项目还处于早期阶段,但它也提供了另一条途径,可以在将来弥补架构支持方面的缺陷。本节的结论虽然没有给出非常确定的答案,但看起来似乎并没有人强烈反对这个“先支持 Rust 设备驱动程序再完成更多架构支持”的计划。

ABI 与内核的兼容性(ABI compatibility with the kernel)

Gaynor 还就 ABI 的兼容性问题请教大家。由于 Rust(目前)是通过 LLVM 编译的,而内核主流上来说还是用 GCC 构建的,因此,将 Rust 代码链接到内核中可能意味着混合 GCC 和 LLVM 生成的代码。尽管 LLVM 的目标是与 GCC 的 ABI 兼容,但还是有点担心这种做法会造成微小的 ABI 不兼容的风险,因此碰到一些阻力。演讲者们想知道内核社区是否更愿意将 Rust 的支持限制在用 Clang 构建的内核上,从而确保兼容性。

Greg Kroah-Hartman 确认说当前的内核规则是:只有当内核中的所有对象文件(object file)都是用相同的编译器,使用相同的 flags 来构建时,兼容性才会得到保证。然而,他也表示,可以将 LLVM 构建的 Rust object 链接到 GCC 构建的内核中,只要这些对象是同时构建的,并设置了适当的选项,而且所产生的这组 configuration 是经过充分测试的,那就可以。他认为在没有出现实际问题之前,没有必要进行额外的限制。Florian Weimer 澄清说,ABI 问题往往是在语言中不明显的角落。例如,通过返回值来返回一个包含 bitfield 的结构这种情况。他认为 ABI 中最主要且常用的部分应该不会造成兼容性问题。

Triplett 强调,GCC 和 Rust 之间的调用在用户空间中是很常见的,也是正常用法,所以从 Rust 方面来说,他并不担心兼容性问题。听起来,这个问题最终应该不会成为将 Rust 引入内核的障碍。

结论(Conclusions)

会议结束时没有定出具体的下一步,但总体看来,人们对最终支持 Rust module 的热情以及需求 越来越形成了一致意见。下一个重要的步骤很可能是某人提出一个真正的 Rust 驱动,并将其纳入内核。只要有一个具体的用例和实现,总是大力推动来搞清楚任何剩余有争议的问题,并达成设计结论。


1.今年,嵌入式系统技术关注热点是什么?

2.深度:单片机到底是如何软硬件结合的?

3.看完此文,就知道如何选择RTOS了!

4.抓住工业互联网新风口,抢滩智能家居万亿市场

5.对国产嵌入式操作系统,你了解多少?

6.用RISC-V微控制器开发难不难?行人搜索AI框架新突破~

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

嵌入式资讯精选 掌握最鲜资讯,尽领行业新风
评论
  • 天问Block和Mixly是两个不同的编程工具,分别在单片机开发和教育编程领域有各自的应用。以下是对它们的详细比较: 基本定义 天问Block:天问Block是一个基于区块链技术的数字身份验证和数据交换平台。它的目标是为用户提供一个安全、去中心化、可信任的数字身份验证和数据交换解决方案。 Mixly:Mixly是一款由北京师范大学教育学部创客教育实验室开发的图形化编程软件,旨在为初学者提供一个易于学习和使用的Arduino编程环境。 主要功能 天问Block:支持STC全系列8位单片机,32位
    丙丁先生 2024-12-11 13:15 47浏览
  • 本文介绍Linux系统(Ubuntu/Debian通用)挂载exfat格式U盘的方法,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。修改对应的内核配置文件# 进入sdk目录cdrk3562_linux# 编辑内核配置文件vi./kernel-5.10/arch/arm64/configs/rockchip_linux_defconfig注:不清楚内核使用哪个defc
    Industio_触觉智能 2024-12-10 09:44 90浏览
  • 全球知名半导体制造商ROHM Co., Ltd.(以下简称“罗姆”)宣布与Taiwan Semiconductor Manufacturing Company Limited(以下简称“台积公司”)就车载氮化镓功率器件的开发和量产事宜建立战略合作伙伴关系。通过该合作关系,双方将致力于将罗姆的氮化镓器件开发技术与台积公司业界先进的GaN-on-Silicon工艺技术优势结合起来,满足市场对高耐压和高频特性优异的功率元器件日益增长的需求。氮化镓功率器件目前主要被用于AC适配器和服务器电源等消费电子和
    电子资讯报 2024-12-10 17:09 84浏览
  • RK3506 是瑞芯微推出的MPU产品,芯片制程为22nm,定位于轻量级、低成本解决方案。该MPU具有低功耗、外设接口丰富、实时性高的特点,适合用多种工商业场景。本文将基于RK3506的设计特点,为大家分析其应用场景。RK3506核心板主要分为三个型号,各型号间的区别如下图:​图 1  RK3506核心板处理器型号场景1:显示HMIRK3506核心板显示接口支持RGB、MIPI、QSPI输出,且支持2D图形加速,轻松运行QT、LVGL等GUI,最快3S内开
    万象奥科 2024-12-11 15:42 66浏览
  • 近日,搭载紫光展锐W517芯片平台的INMO GO2由影目科技正式推出。作为全球首款专为商务场景设计的智能翻译眼镜,INMO GO2 以“快、准、稳”三大核心优势,突破传统翻译产品局限,为全球商务人士带来高效、自然、稳定的跨语言交流体验。 INMO GO2内置的W517芯片,是紫光展锐4G旗舰级智能穿戴平台,采用四核处理器,具有高性能、低功耗的优势,内置超微高集成技术,采用先进工艺,计算能力相比同档位竞品提升4倍,强大的性能提供更加多样化的应用场景。【视频见P盘链接】 依托“
    紫光展锐 2024-12-11 11:50 47浏览
  • 我的一台很多年前人家不要了的九十年代SONY台式组合音响,接手时只有CD功能不行了,因为不需要,也就没修,只使用收音机、磁带机和外接信号功能就够了。最近五年在外地,就断电闲置,没使用了。今年9月回到家里,就一个劲儿地忙着收拾家当,忙了一个多月,太多事啦!修了电气,清理了闲置不用了的电器和电子,就是一个劲儿地扔扔扔!几十年的“工匠式”收留收藏,只能断舍离,拆解不过来的了。一天,忽然感觉室内有股臭味,用鼻子的嗅觉功能朝着臭味重的方向寻找,觉得应该就是这台组合音响?怎么会呢?这无机物的东西不会腐臭吧?
    自做自受 2024-12-10 16:34 136浏览
  •         在有电流流过的导线周围会感生出磁场,再用霍尔器件检测由电流感生的磁场,即可测出产生这个磁场的电流的量值。由此就可以构成霍尔电流、电压传感器。因为霍尔器件的输出电压与加在它上面的磁感应强度以及流过其中的工作电流的乘积成比例,是一个具有乘法器功能的器件,并且可与各种逻辑电路直接接口,还可以直接驱动各种性质的负载。因为霍尔器件的应用原理简单,信号处理方便,器件本身又具有一系列的du特优点,所以在变频器中也发挥了非常重要的作用。  &nb
    锦正茂科技 2024-12-10 12:57 76浏览
  • 【萤火工场CEM5826-M11测评】OLED显示雷达数据本文结合之前关于串口打印雷达监测数据的研究,进一步扩展至 OLED 屏幕显示。该项目整体分为两部分: 一、框架显示; 二、数据采集与填充显示。为了减小 MCU 负担,采用 局部刷新 的方案。1. 显示框架所需库函数 Wire.h 、Adafruit_GFX.h 、Adafruit_SSD1306.h . 代码#include #include #include #include "logo_128x64.h"#include "logo_
    无垠的广袤 2024-12-10 14:03 69浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-10 16:13 105浏览
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 74浏览
  • 智能汽车可替换LED前照灯控制运行的原理涉及多个方面,包括自适应前照灯系统(AFS)的工作原理、传感器的应用、步进电机的控制以及模糊控制策略等。当下时代的智能汽车灯光控制系统通过车载网关控制单元集中控制,表现特殊点的有特斯拉,仅通过前车身控制器,整个系统就包括了灯光旋转开关、车灯变光开关、左LED前照灯总成、右LED前照灯总成、转向柱电子控制单元、CAN数据总线接口、组合仪表控制单元、车载网关控制单元等器件。变光开关、转向开关和辅助操作系统一般连为一体,开关之间通过内部线束和转向柱装置连接为多,
    lauguo2013 2024-12-10 15:53 78浏览
  • 概述 通过前面的研究学习,已经可以在CycloneVGX器件中成功实现完整的TDC(或者说完整的TDL,即延时线),测试结果也比较满足,解决了超大BIN尺寸以及大量0尺寸BIN的问题,但是还是存在一些之前系列器件还未遇到的问题,这些问题将在本文中进行详细描述介绍。 在五代Cyclone器件内部系统时钟受限的情况下,意味着大量逻辑资源将被浪费在于实现较大长度的TDL上面。是否可以找到方法可以对此前TDL的长度进行优化呢?本文还将探讨这个问题。TDC前段BIN颗粒堵塞问题分析 将延时链在逻辑中实现后
    coyoo 2024-12-10 13:28 101浏览
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 70浏览
  •         霍尔传感器是根据霍尔效应制作的一种磁场传感器。霍尔效应是磁电效应的一种,这一现象是霍尔(A.H.Hall,1855—1938)于1879年在研究金属的导电机构时发现的。后来发现半导体、导电流体等也有这种效应,而半导体的霍尔效应比金属强得多,利用这现象制成的各种霍尔元件,广泛地应用于工业自动化技术、检测技术及信息处理等方面。霍尔效应是研究半导体材料性能的基本方法。通过霍尔效应实验测定的霍尔系数,能够判断半导体材料的导电类型、载流子浓度及载流子
    锦正茂科技 2024-12-10 11:07 64浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦