快速入门

本文档介绍了如何开始使用 Rust 进行内核开发。

有几种方法可以安装内核开发所需的 Rust 工具链。一个简单的方法是使用您的 Linux 发行版中的软件包(如果它们适用)-- 下面的第一部分解释了这种方法。这种方法的优点是,通常,发行版会匹配 Rust 和 Clang 使用的 LLVM。

另一种方法是使用 kernel.org 上提供的 LLVM+Rust 的预构建稳定版本。这些是来自 获取 LLVM 的相同精简快速 LLVM 工具链,其中添加了 Linux 支持的 Rust 版本。提供了两组:“最新 LLVM”和“匹配 LLVM”(请参阅链接了解更多信息)。

或者,接下来的两个“要求”部分解释了每个组件以及如何通过 rustup、Rust 的独立安装程序和/或构建它们来安装它们。

本文档的其余部分解释了如何入门的其他方面。

发行版

Arch Linux

Arch Linux 提供了最新的 Rust 版本,因此通常应该可以直接使用,例如:

pacman -S rust rust-src rust-bindgen

Debian

Debian 测试版和 Debian 不稳定版 (Sid),在冻结期之外,提供了最新的 Rust 版本,因此它们通常应该可以直接使用,例如:

apt install rustc rust-src bindgen rustfmt rust-clippy

Fedora Linux

Fedora Linux 提供了最新的 Rust 版本,因此它通常应该可以直接使用,例如:

dnf install rust rust-src bindgen-cli rustfmt clippy

Gentoo Linux

Gentoo Linux(尤其是测试分支)提供了最新的 Rust 版本,因此它通常应该可以直接使用,例如:

USE='rust-src rustfmt clippy' emerge dev-lang/rust dev-util/bindgen

可能需要设置 LIBCLANG_PATH

Nix

Nix(不稳定通道)提供了最新的 Rust 版本,因此它通常应该可以直接使用,例如:

{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
  nativeBuildInputs = with pkgs; [ rustc rust-bindgen rustfmt clippy ];
  RUST_LIB_SRC = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}";
}

openSUSE

openSUSE Slowroll 和 openSUSE Tumbleweed 提供了最新的 Rust 版本,因此它们通常应该可以直接使用,例如:

zypper install rust rust1.79-src rust-bindgen clang

Ubuntu

Ubuntu LTS 和非 LTS(临时)版本提供了最新的 Rust 版本,因此它们通常应该可以直接使用,例如:

apt install rustc-1.80 rust-1.80-src bindgen-0.65 rustfmt-1.80 rust-1.80-clippy

使用版本化的软件包时,需要设置 RUST_LIB_SRC,例如:

RUST_LIB_SRC=/usr/src/rustc-$(rustc-1.80 --version | cut -d' ' -f2)/library

此外,较新的版本(24.04 LTS 和 24.10)中提供了 bindgen-0.65,但在较旧的版本(20.04 LTS 和 22.04 LTS)中可能不可用,因此可能需要手动构建 bindgen(请参阅下文)。

要求:构建

本节介绍如何获取构建所需的工具。

为了轻松检查是否满足要求,可以使用以下目标

make LLVM=1 rustavailable

这会触发 Kconfig 使用的相同逻辑来确定是否应启用 RUST_IS_AVAILABLE;但如果不是这种情况,它也会解释原因。

rustc

需要最新版本的 Rust 编译器。

如果正在使用 rustup,请进入内核构建目录(或使用 --path=<build-dir> 参数到 set 子命令)并运行,例如

rustup override set stable

这将配置您的工作目录以使用给定的 rustc 版本,而不会影响您的默认工具链。

请注意,覆盖适用于当前工作目录(及其子目录)。

如果您没有使用 rustup,请从以下位置获取独立安装程序

Rust 标准库源代码

需要 Rust 标准库源代码,因为构建系统将交叉编译 corealloc

如果正在使用 rustup,请运行

rustup component add rust-src

组件是按工具链安装的,因此稍后升级 Rust 编译器版本需要重新添加组件。

否则,如果使用独立安装程序,则可以将 Rust 源代码树下载到工具链的安装文件夹中

curl -L "https://static.rust-lang.org/dist/rust-src-$(rustc --version | cut -d' ' -f2).tar.gz" |
        tar -xzf - -C "$(rustc --print sysroot)/lib" \
        "rust-src-$(rustc --version | cut -d' ' -f2)/rust-src/lib/" \
        --strip-components=3

在这种情况下,稍后升级 Rust 编译器版本需要手动更新源代码树(这可以通过删除 $(rustc --print sysroot)/lib/rustlib/src/rust 然后重新运行上述命令来完成)。

libclang

libclang(LLVM 的一部分)被 bindgen 用来理解内核中的 C 代码,这意味着需要安装 LLVM;就像使用 LLVM=1 编译内核时一样。

Linux 发行版很可能有一个合适的版本,因此最好首先检查一下。

在以下位置也上传了一些适用于多个系统和架构的二进制文件

否则,构建 LLVM 需要相当长的时间,但它不是一个复杂的过程

有关更多信息和获取预构建版本和发行版包的更多方法,请参阅 使用 Clang/LLVM 构建 Linux

bindgen

内核 C 端的绑定是在构建时使用 bindgen 工具生成的。

例如,通过以下方式安装它(请注意,这将从源代码下载和构建该工具)

cargo install --locked bindgen-cli

bindgen 使用 clang-sys crate 来查找合适的 libclang(它可以静态链接、动态链接或在运行时加载)。默认情况下,上面的 cargo 命令将生成一个将在运行时加载 libclangbindgen 二进制文件。如果未找到(或者应该使用与找到的不同 libclang),则可以调整该过程,例如,使用 LIBCLANG_PATH 环境变量。有关详细信息,请参阅 clang-sys 的文档,网址为

要求:开发

本节介绍如何获取开发所需的工具。也就是说,仅在构建内核时不需要它们。

rustfmt

rustfmt 工具用于自动格式化所有 Rust 内核代码,包括生成的 C 绑定(有关详细信息,请参阅 编码规范)。

如果正在使用 rustup,其 default 配置文件已经安装了该工具,因此无需执行任何操作。如果正在使用其他配置文件,则可以手动安装该组件

rustup component add rustfmt

独立安装程序也附带 rustfmt

clippy

clippy 是一个 Rust 代码检查器。运行它会为 Rust 代码提供额外的警告。可以通过将 CLIPPY=1 传递给 make 来运行它(有关详细信息,请参阅 一般信息)。

如果正在使用 rustup,其 default 配置文件已经安装了该工具,因此无需执行任何操作。如果正在使用其他配置文件,则可以手动安装该组件

rustup component add clippy

独立安装程序也附带 clippy

rustdoc

rustdoc 是 Rust 的文档工具。它为 Rust 代码生成漂亮的 HTML 文档(有关详细信息,请参阅 一般信息)。

rustdoc 还用于测试文档化 Rust 代码中提供的示例(称为 doctest 或文档测试)。rusttest Make 目标使用此功能。

如果正在使用 rustup,所有配置文件都已经安装了该工具,因此无需执行任何操作。

独立安装程序也附带 rustdoc

rust-analyzer

rust-analyzer 语言服务器可以与许多编辑器一起使用,以启用语法高亮、代码补全、跳转到定义等功能。

rust-analyzer 需要一个配置文件 rust-project.json,可以通过 rust-analyzer 的 Make 目标生成。

make LLVM=1 rust-analyzer

配置

需要在 General setup 菜单中启用 Rust support (CONFIG_RUST)。只有在找到合适的 Rust 工具链(见上文)并且满足其他要求时,才会显示此选项。反过来,这将使依赖于 Rust 的其余选项可见。

之后,转到

Kernel hacking
    -> Sample kernel code
        -> Rust samples

并启用一些示例模块,可以作为内置模块或可加载模块。

构建

目前,使用完整的 LLVM 工具链构建内核是最佳支持的设置。即:

make LLVM=1

使用 GCC 也适用于某些配置,但目前仍处于非常实验性的阶段。

开发

要深入了解,请查看 samples/rust/ 中的示例源代码,rust/ 下的 Rust 支持代码以及 Kernel hacking 下的 Rust hacking 菜单。

如果使用 GDB/Binutils 并且 Rust 符号没有被反混淆,原因是工具链还不支持 Rust 的新 v0 混淆方案。有几种解决方法:

  • 安装较新的版本(GDB >= 10.2,Binutils >= 2.36)。

  • 某些版本的 GDB (例如 vanilla GDB 10.1) 能够使用嵌入在调试信息中的预反混淆名称 (CONFIG_DEBUG_INFO)。