快速入門¶
本文件介紹如何開始使用 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)。