162306a36Sopenharmony_ci.. SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci.. include:: ../disclaimer-zh_CN.rst 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci:Original: Documentation/rust/general-information.rst 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci:翻译: 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci 司延腾 Yanteng Si <siyanteng@loongson.cn> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci基本信息 1262306a36Sopenharmony_ci======== 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci本文档包含了在内核中使用Rust支持时需要了解的有用信息。 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci代码文档 1862306a36Sopenharmony_ci-------- 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ciRust内核代码使用其内置的文档生成器 ``rustdoc`` 进行记录。 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci生成的HTML文档包括集成搜索、链接项(如类型、函数、常量)、源代码等。它们可以在以下地址阅读 2362306a36Sopenharmony_ci(TODO:当在主线中时链接,与其他文档一起生成): 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci http://kernel.org/ 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci这些文档也可以很容易地在本地生成和阅读。这相当快(与编译代码本身的顺序相同),而且不需要特 2862306a36Sopenharmony_ci殊的工具或环境。这有一个额外的好处,那就是它们将根据所使用的特定内核配置进行定制。要生成它 2962306a36Sopenharmony_ci们,请使用 ``rustdoc`` 目标,并使用编译时使用的相同调用,例如:: 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci make LLVM=1 rustdoc 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci要在你的网络浏览器中本地阅读该文档,请运行如:: 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci xdg-open rust/doc/kernel/index.html 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci要了解如何编写文档,请看 coding-guidelines.rst 。 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci额外的lints 4162306a36Sopenharmony_ci----------- 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci虽然 ``rustc`` 是一个非常有用的编译器,但一些额外的lints和分析可以通过 ``clippy`` 4462306a36Sopenharmony_ci(一个Rust linter)来实现。要启用它,请将CLIPPY=1传递到用于编译的同一调用中,例如:: 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci make LLVM=1 CLIPPY=1 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci请注意,Clippy可能会改变代码生成,因此在构建产品内核时不应该启用它。 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci抽象和绑定 5162306a36Sopenharmony_ci---------- 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci抽象是用Rust代码包装来自C端的内核功能。 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci为了使用来自C端的函数和类型,需要创建绑定。绑定是Rust对那些来自C端的函数和类型的声明。 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci例如,人们可以在Rust中写一个 ``Mutex`` 抽象,它从C端包装一个 ``Mutex结构体`` ,并 5862306a36Sopenharmony_ci通过绑定调用其函数。 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci抽象并不能用于所有的内核内部API和概念,但随着时间的推移,我们打算扩大覆盖范围。“Leaf” 6162306a36Sopenharmony_ci模块(例如,驱动程序)不应该直接使用C语言的绑定。相反,子系统应该根据需要提供尽可能安 6262306a36Sopenharmony_ci全的抽象。 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci有条件的编译 6662306a36Sopenharmony_ci------------ 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ciRust代码可以访问基于内核配置的条件性编译: 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci.. code-block:: rust 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci #[cfg(CONFIG_X)] // Enabled (`y` or `m`) 7362306a36Sopenharmony_ci #[cfg(CONFIG_X="y")] // Enabled as a built-in (`y`) 7462306a36Sopenharmony_ci #[cfg(CONFIG_X="m")] // Enabled as a module (`m`) 7562306a36Sopenharmony_ci #[cfg(not(CONFIG_X))] // Disabled 76