快速入門

本文件介紹如何開始使用 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 命令將生成一個在執行時載入 libclangbindgen 二進位制檔案。 如果未找到它(或者應使用與找到的 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)。