Esphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/rust/quick-startmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget$/translations/zh_TW/rust/quick-startmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget$/translations/it_IT/rust/quick-startmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget$/translations/ja_JP/rust/quick-startmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget$/translations/ko_KR/rust/quick-startmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget$/translations/pt_BR/rust/quick-startmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget$/translations/sp_SP/rust/quick-startmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhQ/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/rust/quick-start.rsthKubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(h#Documentation/rust/quick-start.rst h]h)}(h"Documentation/rust/quick-start.rsth]h"Documentation/rust/quick-start.rst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhKubj)}(h.司延腾 Yanteng Si h]h)}(h,司延腾 Yanteng Si h](h司延腾 Yanteng Si <}(hj4hhhNhNubh reference)}(hsiyanteng@loongson.cnh]hsiyanteng@loongson.cn}(hj>hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:siyanteng@loongson.cnuh1j<hj4ubh>}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj0ubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(h 快速入门h]h 快速入门}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1johjlhhhhhK ubh)}(h:本文介绍了如何开始使用Rust进行内核开发。h]h:本文介绍了如何开始使用Rust进行内核开发。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjlhhubh)}(hX#安装内核开发所需的 Rust 工具链有几种方式。一种简单的方式是使用 Linux 发行版的软件包 (如果它们合适的话)——下面的第一节解释了这种方法。这种方法的一个优势是,通常发行版会 匹配 Rust 和 Clang 所使用的 LLVM。h]hX#安装内核开发所需的 Rust 工具链有几种方式。一种简单的方式是使用 Linux 发行版的软件包 (如果它们合适的话)——下面的第一节解释了这种方法。这种方法的一个优势是,通常发行版会 匹配 Rust 和 Clang 所使用的 LLVM。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjlhhubh)}(hXy另一种方式是使用 `kernel.org `_ 上提 供的预构建稳定版本的 LLVM+Rust。这些与 :ref:`获取 LLVM ` 中的精 简快速 LLVM 工具链相同,并添加了 Rust for Linux 支持的 Rust 版本。提供了两套工具 链:"最新 LLVM" 和 "匹配 LLVM"(请参阅链接了解更多信息)。h](h另一种方式是使用 }(hjhhhNhNubj=)}(h7`kernel.org `_h]h kernel.org}(hjhhhNhNubah}(h]h ]h"]h$]h&]name kernel.orgrefuri'https://kernel.org/pub/tools/llvm/rust/uh1j<hjubhtarget)}(h* h]h}(h] kernel-orgah ]h"] kernel.orgah$]h&]refurijuh1j referencedKhjubh= 上提 供的预构建稳定版本的 LLVM+Rust。这些与 }(hjhhhNhNubh)}(h':ref:`获取 LLVM `h]hinline)}(hjh]h 获取 LLVM}(hjhhhNhNubah}(h]h ](xrefstdstd-refeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdoc#translations/zh_CN/rust/quick-start refdomainjreftyperef refexplicitrefwarn reftargetzh_cn_getting_llvmuh1hhhhKhjubh 中的精 简快速 LLVM 工具链相同,并添加了 Rust for Linux 支持的 Rust 版本。提供了两套工具 链:”最新 LLVM” 和 “匹配 LLVM”(请参阅链接了解更多信息)。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjlhhubh)}(h或者,接下来的两个 "依赖" 章节将解释每个组件以及如何通过 ``rustup``、Rust 的独立 安装程序或从源码构建来安装它们。h](hW或者,接下来的两个 “依赖” 章节将解释每个组件以及如何通过 }(hjhhhNhNubhliteral)}(h ``rustup``h]hrustup}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhB、Rust 的独立 安装程序或从源码构建来安装它们。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjlhhubh)}(hE本文档的其余部分解释了有关如何入门的其他方面。h]hE本文档的其余部分解释了有关如何入门的其他方面。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjlhhubjk)}(hhh](jp)}(h 发行版h]h 发行版}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1johj(hhhhhK ubjk)}(hhh](jp)}(h Arch Linuxh]h Arch Linux}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1johj9hhhhhK#ubh)}(hLArch Linux 提供较新的 Rust 版本,因此通常开箱即用,例如::h]hKArch Linux 提供较新的 Rust 版本,因此通常开箱即用,例如:}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK%hj9hhubh literal_block)}(h$pacman -S rust rust-src rust-bindgenh]h$pacman -S rust rust-src rust-bindgen}hjZsbah}(h]h ]h"]h$]h&]hhuh1jXhhhK'hj9hhubeh}(h] arch-linuxah ]h"] arch linuxah$]h&]uh1jjhj(hhhhhK#ubjk)}(hhh](jp)}(hDebianh]hDebian}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1johjphhhhhK+ubh)}(hDebian 13(Trixie)以及 Testing 和 Debian Unstable(Sid)提供较新的 Rust 版 本,因此通常开箱即用,例如::h]hDebian 13(Trixie)以及 Testing 和 Debian Unstable(Sid)提供较新的 Rust 版 本,因此通常开箱即用,例如:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK-hjphhubjY)}(h6apt install rustc rust-src bindgen rustfmt rust-clippyh]h6apt install rustc rust-src bindgen rustfmt rust-clippy}hjsbah}(h]h ]h"]h$]h&]hhuh1jXhhhK0hjphhubeh}(h]debianah ]h"]debianah$]h&]uh1jjhj(hhhhhK+ubjk)}(hhh](jp)}(h Fedora Linuxh]h Fedora Linux}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1johjhhhhhK4ubh)}(hNFedora Linux 提供较新的 Rust 版本,因此通常开箱即用,例如::h]hMFedora Linux 提供较新的 Rust 版本,因此通常开箱即用,例如:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjhhubjY)}(h4dnf install rust rust-src bindgen-cli rustfmt clippyh]h4dnf install rust rust-src bindgen-cli rustfmt clippy}hjsbah}(h]h ]h"]h$]h&]hhuh1jXhhhK8hjhhubeh}(h] fedora-linuxah ]h"] fedora linuxah$]h&]uh1jjhj(hhhhhK4ubjk)}(hhh](jp)}(h Gentoo Linuxh]h Gentoo Linux}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1johjhhhhhKhjhhubjY)}(hCUSE='rust-src rustfmt clippy' emerge dev-lang/rust dev-util/bindgenh]hCUSE='rust-src rustfmt clippy' emerge dev-lang/rust dev-util/bindgen}hjsbah}(h]h ]h"]h$]h&]hhuh1jXhhhKAhjhhubh)}(h'可能需要设置 ``LIBCLANG_PATH``。h](h可能需要设置 }(hjhhhNhNubj)}(h``LIBCLANG_PATH``h]h LIBCLANG_PATH}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKChjhhubeh}(h] gentoo-linuxah ]h"] gentoo linuxah$]h&]uh1jjhj(hhhhhK {} }: pkgs.mkShell { nativeBuildInputs = with pkgs; [ rustc rust-bindgen rustfmt clippy ]; RUST_LIB_SRC = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}"; }h]h{ pkgs ? import {} }: pkgs.mkShell { nativeBuildInputs = with pkgs; [ rustc rust-bindgen rustfmt clippy ]; RUST_LIB_SRC = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}"; }}hjNsbah}(h]h ]h"]h$]h&]hhuh1jXhhhKKhj/hhubeh}(h]nixah ]h"]nixah$]h&]uh1jjhj(hhhhhKGubjk)}(hhh](jp)}(hopenSUSEh]hopenSUSE}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1johjdhhhhhKSubh)}(hlopenSUSE Slowroll 和 openSUSE Tumbleweed 提供较新的 Rust 版本,因此通常开箱 即用,例如::h]hkopenSUSE Slowroll 和 openSUSE Tumbleweed 提供较新的 Rust 版本,因此通常开箱 即用,例如:}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKUhjdhhubjY)}(h3zypper install rust rust1.79-src rust-bindgen clangh]h3zypper install rust rust1.79-src rust-bindgen clang}hjsbah}(h]h ]h"]h$]h&]hhuh1jXhhhKXhjdhhubeh}(h]opensuseah ]h"]opensuseah$]h&]uh1jjhj(hhhhhKSubjk)}(hhh](jp)}(hUbuntuh]hUbuntu}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1johjhhhhhK\ubjk)}(hhh](jp)}(h25.04h]h25.04}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1johjhhhhhK_ubh)}(hX最新的 Ubuntu 版本提供较新的 Rust 版本,因此通常开箱即用,例如::h]hW最新的 Ubuntu 版本提供较新的 Rust 版本,因此通常开箱即用,例如:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKahjhhubjY)}(h6apt install rustc rust-src bindgen rustfmt rust-clippyh]h6apt install rustc rust-src bindgen rustfmt rust-clippy}hjsbah}(h]h ]h"]h$]h&]hhuh1jXhhhKchjhhubh)}(h1此外,需要设置 ``RUST_LIB_SRC``,例如::h](h此外,需要设置 }(hjhhhNhNubj)}(h``RUST_LIB_SRC``h]h RUST_LIB_SRC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh ,例如:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKehjhhubjY)}(hFRUST_LIB_SRC=/usr/src/rustc-$(rustc --version | cut -d' ' -f2)/libraryh]hFRUST_LIB_SRC=/usr/src/rustc-$(rustc --version | cut -d' ' -f2)/library}hjsbah}(h]h ]h"]h$]h&]hhuh1jXhhhKghjhhubh)}(hH为方便起见,可以将 ``RUST_LIB_SRC`` 导出到全局环境中。h](h为方便起见,可以将 }(hjhhhNhNubj)}(h``RUST_LIB_SRC``h]h RUST_LIB_SRC}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 导出到全局环境中。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKihjhhubeh}(h]id3ah ]h"]25.04ah$]h&]uh1jjhjhhhhhK_ubjk)}(hhh](jp)}(h24.04 LTS 及更早版本h]h24.04 LTS 及更早版本}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1johj-hhhhhKmubh)}(h虽然 Ubuntu 24.04 LTS 及更早版本仍然提供较新的 Rust 版本,但它们需要一些额外的配 置,使用带版本号的软件包,例如::h]h虽然 Ubuntu 24.04 LTS 及更早版本仍然提供较新的 Rust 版本,但它们需要一些额外的配 置,使用带版本号的软件包,例如:}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKohj-hhubjY)}(hapt 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.80h]hapt 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}hjLsbah}(h]h ]h"]h$]h&]hhuh1jXhhhKrhj-hhubh)}(hb这些软件包都不会将其工具设置为默认值;因此应该显式指定它们,例如::h]ha这些软件包都不会将其工具设置为默认值;因此应该显式指定它们,例如:}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKwhj-hhubjY)}(hmake LLVM=1 RUSTC=rustc-1.80 RUSTDOC=rustdoc-1.80 RUSTFMT=rustfmt-1.80 \ CLIPPY_DRIVER=clippy-driver-1.80 BINDGEN=bindgen-0.65h]hmake LLVM=1 RUSTC=rustc-1.80 RUSTDOC=rustdoc-1.80 RUSTFMT=rustfmt-1.80 \ CLIPPY_DRIVER=clippy-driver-1.80 BINDGEN=bindgen-0.65}hjhsbah}(h]h ]h"]h$]h&]hhuh1jXhhhKyhj-hhubh)}(h或者,修改 ``PATH`` 变量将 Rust 1.80 的二进制文件放在前面,并将 ``bindgen`` 设 置为默认值,例如::h](h或者,修改 }(hjvhhhNhNubj)}(h``PATH``h]hPATH}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubh= 变量将 Rust 1.80 的二进制文件放在前面,并将 }(hjvhhhNhNubj)}(h ``bindgen``h]hbindgen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubh 设 置为默认值,例如:}(hjvhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK|hj-hhubjY)}(hPATH=/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.65h]hPATH=/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}hjsbah}(h]h ]h"]h$]h&]hhuh1jXhhhKhj-hhubh)}(hI使用带版本号的软件包时需要设置 ``RUST_LIB_SRC``,例如::h](h.使用带版本号的软件包时需要设置 }(hjhhhNhNubj)}(h``RUST_LIB_SRC``h]h RUST_LIB_SRC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh ,例如:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj-hhubjY)}(hKRUST_LIB_SRC=/usr/src/rustc-$(rustc-1.80 --version | cut -d' ' -f2)/libraryh]hKRUST_LIB_SRC=/usr/src/rustc-$(rustc-1.80 --version | cut -d' ' -f2)/library}hjsbah}(h]h ]h"]h$]h&]hhuh1jXhhhKhj-hhubh)}(hH为方便起见,可以将 ``RUST_LIB_SRC`` 导出到全局环境中。h](h为方便起见,可以将 }(hjhhhNhNubj)}(h``RUST_LIB_SRC``h]h RUST_LIB_SRC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 导出到全局环境中。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj-hhubh)}(h此外, ``bindgen-0.65`` 在较新的版本(24.04 LTS 和 24.10)中可用,但在更早的版 本(20.04 LTS 和 22.04 LTS)中可能不可用,因此可能需要手动构建 ``bindgen`` (请参见下文)。h](h 此外, }(hjhhhNhNubj)}(h``bindgen-0.65``h]h bindgen-0.65}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 在较新的版本(24.04 LTS 和 24.10)中可用,但在更早的版 本(20.04 LTS 和 22.04 LTS)中可能不可用,因此可能需要手动构建 }(hjhhhNhNubj)}(h ``bindgen``h]hbindgen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh (请参见下文)。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj-hhubeh}(h]ltsah ]h"]24.04 lts 及更早版本ah$]h&]uh1jjhjhhhhhKmubeh}(h]ubuntuah ]h"]ubuntuah$]h&]uh1jjhj(hhhhhK\ubeh}(h]id2ah ]h"] 发行版ah$]h&]uh1jjhjlhhhhhK ubjk)}(hhh](jp)}(h 构建依赖h]h 构建依赖}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1johjNhhhhhKubh)}(h3本节描述了如何获取构建所需的工具。h]h3本节描述了如何获取构建所需的工具。}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjNhhubh)}(hA为了方便检查是否满足要求,可以使用以下目标::h]h@为了方便检查是否满足要求,可以使用以下目标:}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjNhhubjY)}(hmake LLVM=1 rustavailableh]hmake LLVM=1 rustavailable}hj{sbah}(h]h ]h"]h$]h&]hhuh1jXhhhKhjNhhubh)}(h这会触发与Kconfig用来确定是否应该启用 ``RUST_IS_AVAILABLE`` 相同的逻辑;不过,如 果Kconfig认为不该启用,它会列出未满足的条件。h](h5这会触发与Kconfig用来确定是否应该启用 }(hjhhhNhNubj)}(h``RUST_IS_AVAILABLE``h]hRUST_IS_AVAILABLE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh` 相同的逻辑;不过,如 果Kconfig认为不该启用,它会列出未满足的条件。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjNhhubjk)}(hhh](jp)}(hrustch]hrustc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1johjhhhhhKubh)}(h+需要一个较新版本的Rust编译器。h]h+需要一个较新版本的Rust编译器。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h如果使用的是 ``rustup`` ,请进入内核编译目录(或者用 ``--path=`` 参数 来 ``设置`` sub-command),例如运行::h](h如果使用的是 }(hjhhhNhNubj)}(h ``rustup``h]hrustup}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, ,请进入内核编译目录(或者用 }(hjhhhNhNubj)}(h``--path=``h]h--path=}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 参数 来 }(hjhhhNhNubj)}(h ``设置``h]h设置}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh sub-command),例如运行:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubjY)}(hrustup override set stableh]hrustup override set stable}hj sbah}(h]h ]h"]h$]h&]hhuh1jXhhhKhjhhubh)}(hd这将配置你的工作目录使用给定版本的 ``rustc``,而不影响你的默认工具链。h](h4这将配置你的工作目录使用给定版本的 }(hjhhhNhNubj)}(h ``rustc``h]hrustc}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh',而不影响你的默认工具链。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hE请注意覆盖应用当前的工作目录(和它的子目录)。h]hE请注意覆盖应用当前的工作目录(和它的子目录)。}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hX如果你使用 ``rustup``, 可以从下面的链接拉取一个单独的安装程序:h](h如果你使用 }(hjHhhhNhNubj)}(h ``rustup``h]hrustup}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh>, 可以从下面的链接拉取一个单独的安装程序:}(hjHhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh block_quote)}(hNhttps://forge.rust-lang.org/infra/other-installation-methods.html#standalone h]h)}(hLhttps://forge.rust-lang.org/infra/other-installation-methods.html#standaloneh]j=)}(hjph]hLhttps://forge.rust-lang.org/infra/other-installation-methods.html#standalone}(hjrhhhNhNubah}(h]h ]h"]h$]h&]refurijpuh1j<hjnubah}(h]h ]h"]h$]h&]uh1hhhhKhjjubah}(h]h ]h"]h$]h&]uh1jhhhhKhjhhubeh}(h]rustcah ]h"]rustcah$]h&]uh1jjhjNhhhhhKubjk)}(hhh](jp)}(hRust标准库源代码h]hRust标准库源代码}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1johjhhhhhKubh)}(hVRust标准库的源代码是必需的,因为构建系统会交叉编译 ``core`` 。h](hJRust标准库的源代码是必需的,因为构建系统会交叉编译 }(hjhhhNhNubj)}(h``core``h]hcore}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h,如果正在使用 ``rustup`` ,请运行::h](h如果正在使用 }(hjhhhNhNubj)}(h ``rustup``h]hrustup}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh ,请运行:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubjY)}(hrustup component add rust-srch]hrustup component add rust-src}hjsbah}(h]h ]h"]h$]h&]hhuh1jXhhhKhjhhubh)}(hg这些组件是按工具链安装的,因此以后升级Rust编译器版本需要重新添加组件。h]hg这些组件是按工具链安装的,因此以后升级Rust编译器版本需要重新添加组件。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hl否则,如果使用独立的安装程序,可以将Rust源码树下载到安装工具链的文件夹中::h]hk否则,如果使用独立的安装程序,可以将Rust源码树下载到安装工具链的文件夹中:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubjY)}(hcurl -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=3h]hcurl -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}hjsbah}(h]h ]h"]h$]h&]hhuh1jXhhhKhjhhubh)}(h在这种情况下,以后升级Rust编译器版本需要手动更新这个源代码树(这可以通过移除 ``$(rustc --print sysroot)/lib/rustlib/src/rust`` ,然后重新执行上 面的命令做到)。h](hq在这种情况下,以后升级Rust编译器版本需要手动更新这个源代码树(这可以通过移除 }(hjhhhNhNubj)}(h1``$(rustc --print sysroot)/lib/rustlib/src/rust``h]h-$(rustc --print sysroot)/lib/rustlib/src/rust}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2 ,然后重新执行上 面的命令做到)。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]rustah ]h"]rust标准库源代码ah$]h&]uh1jjhjNhhhhhKubjk)}(hhh](jp)}(hlibclangh]hlibclang}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1johjEhhhhhKubh)}(h``bindgen`` 使用 ``libclang`` (LLVM的一部分)来理解内核中的C代码,这意味着需要安 装LLVM;同在开启``LLVM=1`` 时编译内核一样。h](j)}(h ``bindgen``h]hbindgen}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubh 使用 }(hjVhhhNhNubj)}(h ``libclang``h]hlibclang}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubh (LLVM的一部分)来理解内核中的C代码,这意味着需要安 装LLVM;同在开启``LLVM=1`` 时编译内核一样。}(hjVhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjEhhubh)}(hJLinux发行版中可能会有合适的包,所以最好先检查一下。h]hJLinux发行版中可能会有合适的包,所以最好先检查一下。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjEhhubh)}(hN适用于部分系统和架构的二进制文件也可到以下网址下载:h]hN适用于部分系统和架构的二进制文件也可到以下网址下载:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjEhhubji)}(h(https://releases.llvm.org/download.html h]h)}(h'https://releases.llvm.org/download.htmlh]j=)}(hjh]h'https://releases.llvm.org/download.html}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j<hjubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhhhhKhjEhhubh)}(h[或者自行构建LLVM,这需要相当长的时间,但并不是一个复杂的过程:h]h[或者自行构建LLVM,这需要相当长的时间,但并不是一个复杂的过程:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjEhhubji)}(hThttps://llvm.org/docs/GettingStarted.html#getting-the-source-code-and-building-llvm h]h)}(hShttps://llvm.org/docs/GettingStarted.html#getting-the-source-code-and-building-llvmh]j=)}(hjh]hShttps://llvm.org/docs/GettingStarted.html#getting-the-source-code-and-building-llvm}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j<hjubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhhhhKhjEhhubh)}(hz请参阅 Documentation/kbuild/llvm.rst 了解更多信息,以及获取预构建版本和发行包 的进一步方法。h]hz请参阅 Documentation/kbuild/llvm.rst 了解更多信息,以及获取预构建版本和发行包 的进一步方法。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjEhhubeh}(h]libclangah ]h"]libclangah$]h&]uh1jjhjNhhhhhKubjk)}(hhh](jp)}(hbindgenh]hbindgen}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1johjhhhhhKubh)}(hG内核的C端绑定是在构建时使用 ``bindgen`` 工具生成的。h](h)内核的C端绑定是在构建时使用 }(hjhhhNhNubj)}(h ``bindgen``h]hbindgen}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 工具生成的。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h\例如,通过以下方式安装它(注意,这将从源码下载并构建该工具)::h]h[例如,通过以下方式安装它(注意,这将从源码下载并构建该工具):}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubjY)}(h"cargo install --locked bindgen-clih]h"cargo install --locked bindgen-cli}hjGsbah}(h]h ]h"]h$]h&]hhuh1jXhhhKhjhhubh)}(hX``bindgen`` 使用 ``clang-sys`` crate 来查找合适的 ``libclang`` (可以静态链 接、动态链接或在运行时加载)。默认情况下,上面的 ``cargo`` 命令会生成一个在运行时 加载 ``libclang`` 的 ``bindgen`` 二进制文件。如果没有找到(或者应该使用与找到的 不同的 ``libclang``),可以调整该过程,例如使用 ``LIBCLANG_PATH`` 环境变量。详 情请参阅 ``clang-sys`` 的文档:h](j)}(h ``bindgen``h]hbindgen}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh 使用 }(hjUhhhNhNubj)}(h ``clang-sys``h]h clang-sys}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh crate 来查找合适的 }(hjUhhhNhNubj)}(h ``libclang``h]hlibclang}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh] (可以静态链 接、动态链接或在运行时加载)。默认情况下,上面的 }(hjUhhhNhNubj)}(h ``cargo``h]hcargo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh* 命令会生成一个在运行时 加载 }(hjUhhhNhNubj)}(h ``libclang``h]hlibclang}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh 的 }(hjUhhhNhNubj)}(h ``bindgen``h]hbindgen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubhQ 二进制文件。如果没有找到(或者应该使用与找到的 不同的 }(hjUhhhNhNubj)}(h ``libclang``h]hlibclang}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh+),可以调整该过程,例如使用 }(hjUhhhNhNubj)}(h``LIBCLANG_PATH``h]h LIBCLANG_PATH}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh! 环境变量。详 情请参阅 }(hjUhhhNhNubj)}(h ``clang-sys``h]h clang-sys}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh 的文档:}(hjUhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubji)}(hnhttps://github.com/KyleMayes/clang-sys#linking https://github.com/KyleMayes/clang-sys#environment-variables h](h)}(h.https://github.com/KyleMayes/clang-sys#linkingh]j=)}(hj h]h.https://github.com/KyleMayes/clang-sys#linking}(hj hhhNhNubah}(h]h ]h"]h$]h&]refurij uh1j<hj ubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubh)}(h`_ 语言服务器可以和许多编辑器 一起使用,以实现语法高亮、补全、转到定义和其他功能。h](j=)}(h3`rust-analyzer `_h]h rust-analyzer}(hjp hhhNhNubah}(h]h ]h"]h$]h&]name rust-analyzerj https://rust-analyzer.github.io/uh1j<hjl ubj)}(h# h]h}(h]id6ah ]h"] rust-analyzerah$]h&]refurij uh1jjKhjl ubhw 语言服务器可以和许多编辑器 一起使用,以实现语法高亮、补全、转到定义和其他功能。}(hjl hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM hj[ hhubh)}(hw``rust-analyzer`` 需要一个配置文件, ``rust-project.json``, 它可以由 ``rust-analyzer`` Make 目标生成::h](j)}(h``rust-analyzer``h]h rust-analyzer}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 需要一个配置文件, }(hj hhhNhNubj)}(h``rust-project.json``h]hrust-project.json}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh, 它可以由 }(hj hhhNhNubj)}(h``rust-analyzer``h]h rust-analyzer}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh Make 目标生成:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM#hj[ hhubjY)}(hmake LLVM=1 rust-analyzerh]hmake LLVM=1 rust-analyzer}hj sbah}(h]h ]h"]h$]h&]hhuh1jXhhhM&hj[ hhubeh}(h] rust-analyzerah ]h"]h$]j ah&]uh1jjhjK hhhhhMjKubeh}(h]id5ah ]h"] 开发依赖ah$]h&]uh1jjhjlhhhhhKubjk)}(hhh](jp)}(h配置h]h配置}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1johj hhhhhM*ubh)}(hRust支持(CONFIG_RUST)需要在 ``General setup`` 菜单中启用。在其他要求得到满足的情 况下,该选项只有在找到合适的Rust工具链时才会显示(见上文)。相应的,这将使依赖Rust的其 他选项可见。h](h%Rust支持(CONFIG_RUST)需要在 }(hj hhhNhNubj)}(h``General setup``h]h General setup}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 菜单中启用。在其他要求得到满足的情 况下,该选项只有在找到合适的Rust工具链时才会显示(见上文)。相应的,这将使依赖Rust的其 他选项可见。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM,hj hhubh)}(h之后,进入::h]h之后,进入:}(hj& hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM0hj hhubjY)}(h@Kernel hacking -> Sample kernel code -> Rust samplesh]h@Kernel hacking -> Sample kernel code -> Rust samples}hj4 sbah}(h]h ]h"]h$]h&]hhuh1jXhhhM2hj hhubh)}(h3并启用一些内置或可加载的样例模块。h]h3并启用一些内置或可加载的样例模块。}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM6hj hhubeh}(h]id7ah ]h"]配置ah$]h&]uh1jjhjlhhhhhM*ubjk)}(hhh](jp)}(h构建h]h构建}(hj[ hhhNhNubah}(h]h ]h"]h$]h&]uh1johjX hhhhhM:ubh)}(hK用完整的LLVM工具链构建内核是目前支持的最佳设置。即::h]hJ用完整的LLVM工具链构建内核是目前支持的最佳设置。即:}(hji hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM<hjX hhubjY)}(h make LLVM=1h]h make LLVM=1}hjw sbah}(h]h ]h"]h$]h&]hhuh1jXhhhM>hjX hhubh)}(hN使用GCC对某些配置也是可行的,但目前它是非常试验性的。h]hN使用GCC对某些配置也是可行的,但目前它是非常试验性的。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM@hjX hhubeh}(h]id8ah ]h"]构建ah$]h&]uh1jjhjlhhhhhM:ubjk)}(hhh](jp)}(h折腾h]h折腾}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1johj hhhhhMDubh)}(h要想深入了解,请看 ``samples/rust/`` 下的样例源代码、 ``rust/`` 下的Rust支持代码和 ``Kernel hacking`` 下的 ``Rust hacking`` 菜单。h](h要想深入了解,请看 }(hj hhhNhNubj)}(h``samples/rust/``h]h samples/rust/}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 下的样例源代码、 }(hj hhhNhNubj)}(h ``rust/``h]hrust/}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 下的Rust支持代码和 }(hj hhhNhNubj)}(h``Kernel hacking``h]hKernel hacking}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 下的 }(hj hhhNhNubj)}(h``Rust hacking``h]h Rust hacking}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 菜单。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMFhj hhubh)}(h如果使用的是GDB/Binutils,而Rust符号没有被demangled,原因是工具链还不支持Rust的新v0 mangling方案。有几个办法可以解决:h]h如果使用的是GDB/Binutils,而Rust符号没有被demangled,原因是工具链还不支持Rust的新v0 mangling方案。有几个办法可以解决:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMIhj hhubh bullet_list)}(hhh](h list_item)}(hB安装一个较新的版本(GDB >= 10.2, Binutils >= 2.36)。 h]h)}(hA安装一个较新的版本(GDB >= 10.2, Binutils >= 2.36)。h]hA安装一个较新的版本(GDB >= 10.2, Binutils >= 2.36)。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMLhj ubah}(h]h ]h"]h$]h&]uh1j hj hhhhhNubj )}(h一些版本的GDB(例如vanilla GDB 10.1)能够使用嵌入在调试信息(``CONFIG_DEBUG_INFO``) 中的pre-demangled的名字。h]h)}(h一些版本的GDB(例如vanilla GDB 10.1)能够使用嵌入在调试信息(``CONFIG_DEBUG_INFO``) 中的pre-demangled的名字。h](hP一些版本的GDB(例如vanilla GDB 10.1)能够使用嵌入在调试信息(}(hj3 hhhNhNubj)}(h``CONFIG_DEBUG_INFO``h]hCONFIG_DEBUG_INFO}(hj; hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3 ubh!) 中的pre-demangled的名字。}(hj3 hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMNhj/ ubah}(h]h ]h"]h$]h&]uh1j hj hhhhhNubeh}(h]h ]h"]h$]h&]bullet-uh1j hhhMLhj hhubeh}(h]id9ah ]h"]折腾ah$]h&]uh1jjhjlhhhhhMDubeh}(h]id1ah ]h"] 快速入门ah$]h&]uh1jjhhhhhhhK ubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(joN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jn jk jjjKjHjmjjjjjjj,j)jaj^jjjCj@j*j'j;j8jH jE jjjBj?jjj@ j= j j j j j j jX jU rust-analyzerj jU jR j j jf jc u nametypes}(jn jjKjmjjj,jajjCj*j;jH jjBjj@ j j j jX j jU j jf uh}(jk jljjjHj(jjj9jjpjjj)jj^j/jjdj@jj'jj8j-jE jNjjj?jjjEj= jj jK j jj j j jU j j j[ j j jR j j jX jc j u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}j K sRparse_messages]hsystem_message)}(hhh]h)}(h0Duplicate implicit target name: "rust-analyzer".h]h4Duplicate implicit target name: “rust-analyzer”.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj ubah}(h]h ]h"]h$]h&]j alevelKtypeINFOsourcehnjlineK uh1j hj[ hhhhhM!ubatransform_messages] transformerN include_log]5Documentation/translations/zh_CN/rust/quick-start.rst(NNNNta decorationNhhub.