快速入门

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

安装内核开发所需的 Rust 工具链有几种方法。如果合适的话,一个简单的方法是使用你的 Linux 发行版中的软件包——下面的第一节将解释这种方法。这种方法的一个优点是,通常发行版会匹配 Rust 和 Clang 所使用的 LLVM。

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

或者,接下来的两个“要求 (Requirements)”部分将解释每个组件以及如何通过 rustup、来自 Rust 的独立安装程序和/或从源码构建它们来安装这些组件。

文档的其余部分解释了有关如何开始的其他方面。

发行版

Arch Linux

Arch Linux 提供了较新的 Rust 版本,因此通常可以直接开箱即用,例如

pacman -S rust rust-src rust-bindgen

Debian

Debian 13 (Trixie)、Testing 以及 Debian Unstable (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 rust-src rust-bindgen clang

Ubuntu

Ubuntu 25.10 和 26.04 LTS 提供了较新的 Rust 版本,因此它们通常可以直接开箱即用,例如

apt install rustc rust-src bindgen rustfmt rust-clippy

此外,需要设置 RUST_LIB_SRC,例如

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

为了方便起见,可以将 RUST_LIB_SRC 导出到全局环境中。

24.04 LTS 及更旧版本

尽管 Ubuntu 24.04 LTS 及更旧版本仍提供较新的 Rust 版本,但它们需要进行一些额外的配置,使用带版本的软件包,例如

apt install rustc-1.85 rust-1.85-src bindgen-0.71 rustfmt-1.85 \
        rust-1.85-clippy
ln -s /usr/lib/rust-1.85/bin/rustfmt /usr/bin/rustfmt-1.85
ln -s /usr/lib/rust-1.85/bin/clippy-driver /usr/bin/clippy-driver-1.85

这些软件包都没有将它们的工具设置为默认值;因此应该显式指定它们,例如

make LLVM=1 RUSTC=rustc-1.85 RUSTDOC=rustdoc-1.85 RUSTFMT=rustfmt-1.85 \
        CLIPPY_DRIVER=clippy-driver-1.85 BINDGEN=bindgen-0.71

或者,修改 PATH 变量将 Rust 1.85 二进制文件放在首位,并将 bindgen 设置为默认值,例如

PATH=/usr/lib/rust-1.85/bin:$PATH
update-alternatives --install /usr/bin/bindgen bindgen \
        /usr/bin/bindgen-0.71 100
update-alternatives --set bindgen /usr/bin/bindgen-0.71

使用带版本的软件包时,可能需要设置 RUST_LIB_SRC,例如

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

为了方便起见,可以将 RUST_LIB_SRC 导出到全局环境中。

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

要求:构建

本节解释如何获取构建所需的工具。

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

make LLVM=1 rustavailable

这会触发 Kconfig 用于确定是否应启用 RUST_IS_AVAILABLE 的相同逻辑;但如果未满足,它还会解释原因。

rustc

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

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

rustup override set stable

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

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

如果你没有使用 rustup,请从以下地址获取独立安装程序

Rust 标准库源码

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

如果正在使用 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

bindgen 使用 libclang(LLVM 的一部分)来理解内核中的 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 代码静态检查工具 (linter)。运行它可以为 Rust 代码提供额外的警告。通过向 make 传递 CLIPPY=1 可以运行它(有关详细信息,请参阅 通用信息)。

如果正在使用 rustup,其 default 配置文件已经安装了该工具,因此无需做任何事情。如果使用的是其他配置文件,可以手动安装该组件

rustup component add clippy

独立安装程序也自带 clippy

rustdoc

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

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

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

独立安装程序也自带 rustdoc

rust-analyzer

rust-analyzer 语言服务器可以与许多编辑器配合使用,以启用语法高亮、自动补全、跳转到定义和其他功能。

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

make LLVM=1 rust-analyzer

配置

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

然后,转到

Kernel hacking
    -> Sample kernel code
        -> Rust samples

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

构建

使用完整的 LLVM 工具链构建内核是目前支持得最好的设置。也就是说

make LLVM=1

对于某些配置,使用 GCC 也可以工作,但目前它非常具有实验性。

Hacking

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