1*55bd06ffSYanteng Si.. SPDX-License-Identifier: GPL-2.0 2*55bd06ffSYanteng Si.. include:: ../disclaimer-zh_CN.rst 3*55bd06ffSYanteng Si 4*55bd06ffSYanteng Si:Original: Documentation/rust/general-information.rst 5*55bd06ffSYanteng Si 6*55bd06ffSYanteng Si:翻译: 7*55bd06ffSYanteng Si 8*55bd06ffSYanteng Si 司延腾 Yanteng Si <siyanteng@loongson.cn> 9*55bd06ffSYanteng Si 10*55bd06ffSYanteng Si 11*55bd06ffSYanteng Si基本信息 12*55bd06ffSYanteng Si======== 13*55bd06ffSYanteng Si 14*55bd06ffSYanteng Si本文档包含了在内核中使用Rust支持时需要了解的有用信息。 15*55bd06ffSYanteng Si 16*55bd06ffSYanteng Si 17*55bd06ffSYanteng Si代码文档 18*55bd06ffSYanteng Si-------- 19*55bd06ffSYanteng Si 20*55bd06ffSYanteng SiRust内核代码使用其内置的文档生成器 ``rustdoc`` 进行记录。 21*55bd06ffSYanteng Si 22*55bd06ffSYanteng Si生成的HTML文档包括集成搜索、链接项(如类型、函数、常量)、源代码等。它们可以在以下地址阅读 23*55bd06ffSYanteng Si(TODO:当在主线中时链接,与其他文档一起生成): 24*55bd06ffSYanteng Si 25*55bd06ffSYanteng Si http://kernel.org/ 26*55bd06ffSYanteng Si 27*55bd06ffSYanteng Si这些文档也可以很容易地在本地生成和阅读。这相当快(与编译代码本身的顺序相同),而且不需要特 28*55bd06ffSYanteng Si殊的工具或环境。这有一个额外的好处,那就是它们将根据所使用的特定内核配置进行定制。要生成它 29*55bd06ffSYanteng Si们,请使用 ``rustdoc`` 目标,并使用编译时使用的相同调用,例如:: 30*55bd06ffSYanteng Si 31*55bd06ffSYanteng Si make LLVM=1 rustdoc 32*55bd06ffSYanteng Si 33*55bd06ffSYanteng Si要在你的网络浏览器中本地阅读该文档,请运行如:: 34*55bd06ffSYanteng Si 35*55bd06ffSYanteng Si xdg-open rust/doc/kernel/index.html 36*55bd06ffSYanteng Si 37*55bd06ffSYanteng Si要了解如何编写文档,请看 coding-guidelines.rst 。 38*55bd06ffSYanteng Si 39*55bd06ffSYanteng Si 40*55bd06ffSYanteng Si额外的lints 41*55bd06ffSYanteng Si----------- 42*55bd06ffSYanteng Si 43*55bd06ffSYanteng Si虽然 ``rustc`` 是一个非常有用的编译器,但一些额外的lints和分析可以通过 ``clippy`` 44*55bd06ffSYanteng Si(一个Rust linter)来实现。要启用它,请将CLIPPY=1传递到用于编译的同一调用中,例如:: 45*55bd06ffSYanteng Si 46*55bd06ffSYanteng Si make LLVM=1 CLIPPY=1 47*55bd06ffSYanteng Si 48*55bd06ffSYanteng Si请注意,Clippy可能会改变代码生成,因此在构建产品内核时不应该启用它。 49*55bd06ffSYanteng Si 50*55bd06ffSYanteng Si抽象和绑定 51*55bd06ffSYanteng Si---------- 52*55bd06ffSYanteng Si 53*55bd06ffSYanteng Si抽象是用Rust代码包装来自C端的内核功能。 54*55bd06ffSYanteng Si 55*55bd06ffSYanteng Si为了使用来自C端的函数和类型,需要创建绑定。绑定是Rust对那些来自C端的函数和类型的声明。 56*55bd06ffSYanteng Si 57*55bd06ffSYanteng Si例如,人们可以在Rust中写一个 ``Mutex`` 抽象,它从C端包装一个 ``Mutex结构体`` ,并 58*55bd06ffSYanteng Si通过绑定调用其函数。 59*55bd06ffSYanteng Si 60*55bd06ffSYanteng Si抽象并不能用于所有的内核内部API和概念,但随着时间的推移,我们打算扩大覆盖范围。“Leaf” 61*55bd06ffSYanteng Si模块(例如,驱动程序)不应该直接使用C语言的绑定。相反,子系统应该根据需要提供尽可能安 62*55bd06ffSYanteng Si全的抽象。 63*55bd06ffSYanteng Si 64*55bd06ffSYanteng Si 65*55bd06ffSYanteng Si有条件的编译 66*55bd06ffSYanteng Si------------ 67*55bd06ffSYanteng Si 68*55bd06ffSYanteng SiRust代码可以访问基于内核配置的条件性编译: 69*55bd06ffSYanteng Si 70*55bd06ffSYanteng Si.. code-block:: rust 71*55bd06ffSYanteng Si 72*55bd06ffSYanteng Si #[cfg(CONFIG_X)] // Enabled (`y` or `m`) 73*55bd06ffSYanteng Si #[cfg(CONFIG_X="y")] // Enabled as a built-in (`y`) 74*55bd06ffSYanteng Si #[cfg(CONFIG_X="m")] // Enabled as a module (`m`) 75*55bd06ffSYanteng Si #[cfg(not(CONFIG_X))] // Disabled 76