快速入门¶
本文档介绍如何开始使用 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 命令将生成一个在运行时加载 libclang 的 bindgen 二进制文件。如果未找到(或者应该使用与找到的不同的 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 support(CONFIG_RUST)。只有在找到合适的 Rust 工具链(见上文)且满足其他要求时,才会显示该选项。反过来,这将使依赖于 Rust 的其余选项可见。
然后,转到
Kernel hacking
-> Sample kernel code
-> Rust samples
并启用一些作为内置模块或可加载模块的示例模块。
构建¶
使用完整的 LLVM 工具链构建内核是目前支持得最好的设置。也就是说
make LLVM=1
对于某些配置,使用 GCC 也可以工作,但目前它非常具有实验性。
Hacking¶
要深入了解,请查看位于 samples/rust/ 的示例源码、rust/ 下的 Rust 支持代码以及 Kernel hacking 下的 Rust hacking 菜单。