快速入门¶
本文档介绍了如何开始使用 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 标准库源代码,因为构建系统将交叉编译 core
和 alloc
。
如果正在使用 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
命令将生成一个将在运行时加载 libclang
的 bindgen
二进制文件。如果未找到(或者应该使用与找到的不同 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
)。