Linux 内核补丁第三版,支持 Rust 语言

Rust-for-Linux 项目的作者 Miguel Ojeda 提出了第三个组件选项,用于使用 Rust 语言开发设备驱动程序,供 Linux 内核开发人员考虑。 Rust 支持被认为是实验性的,但已经同意包含在 linux-next 分支中。 该开发由 Google 和 ISRG(互联网安全研究小组)资助,ISRG 是 Let's Encrypt 项目的创始人,致力于推动 HTTPS 以及提高互联网安全性的技术开发。

回想一下,提议的更改使得可以使用 Rust 作为开发驱动程序和内核模块的第二语言。 Rust 支持作为一个选项提供,默认情况下不启用,并且不会导致 Rust 被包含为内核所需的构建依赖项。 使用 Rust 进行驱动程序开发将允许您以最小的努力创建更安全、更好的驱动程序,并且不会出现释放后内存访问、空指针取消引用和缓冲区溢出等问题。

Rust 在编译时通过引用检查、跟踪对象所有权和对象生命周期(作用域)以及在代码执行期间评估内存访问的正确性来提供内存安全处理。 Rust 还提供防止整数溢出的保护,要求在使用前强制初始化变量值,更好地处理标准库中的错误,默认应用不可变引用和变量的概念,提供强静态类型以最小化逻辑错误。

新版本的补丁继续消除了在讨论第一版和第二版补丁时所做的评论。 最明显的变化:

  • 已过渡到使用 Rust 1.57 的稳定版本作为参考编译器,并提供了 Rust 2021 语言稳定版本的链接。此前,补丁与 Rust 的 beta 分支相关联,并使用了一些语言功能,被归类为不稳定。 向 Rust 2021 规范的过渡使我们能够开始工作,以避免在补丁中使用 const_fn_transmute、const_panic、const_unavailable_unchecked 以及 core_panic 和 try_reserve 等不稳定功能。
  • 补丁中包含的 Rust 库的 alloc 版本的开发仍在继续,并进行了修改,以消除内存分配函数在发生错误(例如内存不足)时可能生成的“恐慌”状态。 新版本实现了“no_rc”和“no_sync”选项来禁用内核 Rust 代码中未使用的功能,使库更加模块化。 主要分配开发人员的工作仍在继续,旨在将内核所需的更改转移到主库。 该库在内核级别工作所需的“no_fp_fmt_parse”选项已移至 Rust 基础库(核心)。
  • 代码已被清理,以消除在 CONFIG_WERROR 模式下构建内核时可能出现的编译器警告。 在 Rust 中构建代码时,会启用额外的编译器诊断模式和 Clippy linter 警告。
  • 建议在 Rust 代码中使用抽象来实现 seqlock(序列锁)、电源管理回调调用、I/O 内存(readX/writeX)、中断和线程处理程序、GPIO、设备访问、驱动程序和凭证。
  • 驱动程序开发工具已扩展到包括可重定位互斥体、位迭代器、简化的指针绑定、改进的故障诊断和独立于数据总线的基础设施。
  • 基于 refcount_t 后端,使用简化的 Ref 类型改进了链接的工作,该后端使用同名的内核 API 来计数引用。 标准分配库中提供的对 Arc 和 Rc 类型的支持已被删除,并且在内核级别执行的代码中不可用(已为库本身准备了禁用这些类型的选项)。
  • 这些补丁包括用 Rust 重写的 PL061 GPIO 驱动程序版本。 该驱动程序的一个特点是其实现几乎逐行重复 C 语言中的现有 GPIO 驱动程序。 对于想要熟悉在 Rust 中创建驱动程序的开发人员,我们准备了逐行比较,使他们能够了解 C 代码被转换成 Rust 中的哪些结构。
  • 主要 Rust 代码库采用了 rustc_codegen_gcc,它是 GCC 的 rustc 后端,使用 libgccjit 库实现提前 (AOT) 编译。 通过正确开发后端,您将可以使用 GCC 收集内核中涉及的 Rust 代码。
  • 除了 ARM、谷歌和微软之外,红帽也表示有兴趣在 Linux 内核中使用 Rust 语言。 让我们回想一下,Google 直接为 Rust for Linux 项目提供了支持,正在开发 Rust 中 Binder 进程间通信机制的新实现,并且正在考虑在 Rust 中重新设计各种驱动程序的可能性。 Microsoft 已开始在 Rust 中实现 Hyper-V 驱动程序。 ARM 正在努力改进对基于 ARM 的系统的 Rust 支持。 IBM 已经为 PowerPC 系统实现了 Rust 的内核支持。

来源: opennet.ru

添加评论