快速入门¶
本文档介绍如何开始使用 Rust 进行内核开发。
有几种方法可以安装内核开发所需的 Rust 工具链。 一种简单的方法是使用 Linux 发行版中的软件包(如果它们适用)——以下第一部分解释了这种方法。 这种方法的一个优点是,通常,发行版将匹配 Rust 和 Clang 使用的 LLVM。
另一种方法是使用 kernel.org 上提供的 LLVM+Rust 的预构建稳定版本。 这些是与 获取 LLVM 中相同的精简快速 LLVM 工具链,并添加了 Rust for Linux 支持的 Rust 版本。 提供了两组:“最新 LLVM”和“匹配 LLVM”(请参阅链接以获取更多信息)。
或者,接下来的两个“要求”部分解释了每个组件以及如何通过 rustup
、Rust 的独立安装程序和/或构建它们来安装它们。
文档的其余部分解释了如何开始使用的其他方面。
发行版¶
Arch Linux¶
Arch Linux 提供最新的 Rust 版本,因此通常应该可以正常工作,例如
pacman -S rust rust-src rust-bindgen
Debian¶
Debian 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 rust1.79-src rust-bindgen clang
Ubuntu¶
25.04¶
最新的 Ubuntu 版本提供最新的 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.80 rust-1.80-src bindgen-0.65 rustfmt-1.80 \
rust-1.80-clippy
ln -s /usr/lib/rust-1.80/bin/rustfmt /usr/bin/rustfmt-1.80
ln -s /usr/lib/rust-1.80/bin/clippy-driver /usr/bin/clippy-driver-1.80
这些软件包都不会将其工具设置为默认值; 因此,应明确指定它们,例如
make LLVM=1 RUSTC=rustc-1.80 RUSTDOC=rustdoc-1.80 RUSTFMT=rustfmt-1.80 \
CLIPPY_DRIVER=clippy-driver-1.80 BINDGEN=bindgen-0.65
或者,修改 PATH
变量以首先放置 Rust 1.80 二进制文件,并将 bindgen
设置为默认值,例如
PATH=/usr/lib/rust-1.80/bin:$PATH
update-alternatives --install /usr/bin/bindgen bindgen \
/usr/bin/bindgen-0.65 100
update-alternatives --set bindgen /usr/bin/bindgen-0.65
使用版本化的软件包时,需要设置 RUST_LIB_SRC
,例如
RUST_LIB_SRC=/usr/src/rustc-$(rustc-1.80 --version | cut -d' ' -f2)/library
为了方便起见,可以将 RUST_LIB_SRC
导出到全局环境。
此外,较新版本(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 标准库源代码,因为构建系统将交叉编译 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
),则可以调整该过程,例如,通过使用 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 也适用于某些配置,但目前仍处于实验阶段。
Hacking¶
要更深入地了解,请查看 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
)。