带你熟悉鸿蒙轻内核 Kconfig 使用指南
摘要:本文介绍了 Kconfig 的基础知识,和鸿蒙轻内核的图形化配置及进阶的使用方法。
本文分享自华为云社区《鸿蒙轻内核Kconfig使用笔记》,作者: zhushy。
1、 Kconfig 简介
Kconfig 语言定义了一套完整的规则来表述配置项及配置项间的关系,详细内容可以参考 Linux 官方文档 Kconfig Language,此处不赘述。鸿蒙轻内核使用的是 Python 的开源三方库 kconfiglib(menuconfig 只是其提供的命令之一,相关命令还有 genconfig, savedefconfig 等等),官方主页为https://pypi.org/project/kconfiglib。
1.1 Kconfig 和.config 文件
Kconfig 是配置项的描述文件,支持设置配置项及其默认值,依赖关系等等,比如 kernel\liteos_a\Kconfig,该文件还会继续依赖各个模块的 Kconfig 文件。
产品配置文件,如 vendor\hisilicon\hispark_taurus\kernel_configs\debug.config,提供配置项及在产品中这些配置项的设置值,可能和内核配置项的默认取值不一致,属于产品对内核配置项的定制。这些配置文件在 BUILD.gn 或 makefile 文件中使用。
另外还会生成一个 C 语言头文件,提供配置项的宏定义版,在 C 语言程序中使用。
1.2 操作简介
下载 OpenHarmony 源代码后,使用 hb set 设置产品解决方案后,然后在 kernel/liteos_m 或 liteos_a 目录下执行 make help 可获得一个总体的帮助说明,如下图所示:
其中与 Kconfig 有关的为 xxconfig 类目标,这类目标通过 args 接收额外的参数,比如:
通过 args="–help"就可以了解 xxconfig 类命令的使用详细说明。
支持的参数有文件类型 FSTYPE,版本类别 TEE、RELEASE 等版本,默认为 DEBUG 版本。还支持通过 CONFIG 参数指定产品配置文件路径,该参数优先级较高。
注意:OpenHarmony 支持使用 ninja+gn 来编译构建,内核使用的 kconfig 配置工具依旧使用 makefile 进行维护的。
2、 配置内核
liteos_a 内核使用 Kconfig 方式进行配置,在内核目录 kernel/liteos_a 下执行 make menuconfig 等命令即可。liteos_m 内核类似,以 liteos_a 为例进行讲解。
需要注意:
在操作前,需要使用 hb set 设置产品,否则会提示:The selected product (None) is not a liteos_a kernel type product. Stop。
2.1 支持的参数
上文,我们知道了 make menuconfig 支持参数,我们详细看下代码。文件位置在 kernel/liteos_a/Makefile,代码片段如下:如果指定了 CONFIG 参数,则使用用户指定的产品配置文件。如果开启了 TEE,则使用 TEE 版本的产品配置文件。如果开启了 RELEASE,则使用 release 版本产品配置文件,否则使用 debug 版本的产品配置文件。
2.2 menuconfig 内核配置
使用 make menuconfig 进行内核配置,Makefile 源码片段如下:
可以看出,update_config 和 menuconfig 这 2 个 target 效果相同,一般使用 make menuconfig 即可。执行的操作包含如下 3 个:
判断产品配置文件是否存在,如果存在则把配置文件复制到内核根目录并命名为.config
展示 menuconfig 用户配置界面,供开发者进行内核配置
保存最小配置到产品产品文件,可以使用 make savedefconfig args="–help"查看命令的解释。
设置产品后,要修改产品的.config 配置,目前可以在内核目录下执行 make menuconfig,没有 make 参数的情况下该命令默认会自动找到你 hb set 时所选择的产品的 debug.config 配置进行 menuconfig 配置,如果想要修改产品的 release.config 配置则可以使用参数 RELEASE=1。前提是产品有预置 release.config 配置。同样的,可以使用参数 TEE=1 来修改产品的 tee 版本的.config 配置。命令如下:
另外,如果想手动指定产品配置,而不是自动使用 hb set 时所选择的产品的配置,则可以使用 CONFIG=/path/to/the/xx.config 参数,如:
3、Kconfig 高级语法
Kconfig 大部分工程师都了解,快速介绍几个鸿蒙轻内核中使用到的稍微高级的语法。
osource
我们知道 kconfig 使用 source 来引用其他 kconfig 文件,而 osource 等于 optional source,表示可选的,如果 osource 指定的 kconfig 文件不存在,也不报错。类似,makefile 中的 include 和-include 的差异。
rsource
rsource 等于 relative source,后面引用的 kconfig 文件支持相对路径。路径相对于包含 rsource 语句的 kconfig 而言。
orsource
等于 osource+rsource。
kconf 的几个命令如下“
–oldconfig
基于提供的.config 文件,根据 Kconfig 文件修改配置文件
–silentoldconfig
等同于 oldconfig,静默模式,并修改 deps 依赖即生成头文件。
–olddefconfig
等同于 silentoldconfig,对于新符号使用默认值
–savedefconfig <file>
把当前最小的配置保持到文件<file>
4、 hb set、Makefile 和 kconfig 的关系
我们知道在 make menuconfig 之前,必须使用 hb set 设置产品解决方案,下面看下具体是如何做到的。
在 kernel\liteos_m\Makefile 文件中,有如下 makefile 片段。⑴处使用 makefile foreach 命令和 shell sed 命令循环处理 hb set 输出的每一行,把“key:value”格式去掉多余的[OHOS INFO]字符,把空格转换为下划线,即转换的格式为“key=value”,然后转换为 makefile 的变量形式。hb env 的输出、shell 命令的输出见下文。
ohos_device_path=/home/zhushy/openharmony/device/board/fnlink/v200zr/liteos_m
⑵处判断解析 hb set 获取的 ohos_kernel 内核是否等于 liteos_m,如果不等于,则说明未使用 hb set 设置产品解决解决方案,或者设置的不是 liteos_m 内核。设置 liteos_a\linux 内核时,不能在 kernel\liteos_m 目录下执行 make menuconfig。除了 ohos_kernel,生成的变量还有 ohos_product、ohos_product_path、ohos_device_path、ohos_device_company 等等。
⑶处的 makefile 片段表明,makefile 还有 make help 里面没有提到的参数用法。可以使用 make PRODUCT_PATH=XX_Device_Path_XXX 等命令来替代使用 hb set 设置的产品解决方案对应的设备路径。⑷处将这些设置导出为环境变量。在 kernel\liteos_m\Kconfig 文件中会使用这些环境变量。
hb env 的输出类似如下:
执行 shell 命令 hb env | sed 's/\[OHOS INFO\]/ohos/g;s/ /_/g;s/:_/=/g'的输出如下:
5、 芯片、单板、扩展板的 Kconfig 配置
在执行 make menuconfig,进入 platform 配置路径后,可以看到如下图所示的配置界面,支持对扩展板、单板、芯片系列等配置。总体感觉这块后续应该还需要继续优化调整。hb set 设置产品解决方案时,已经确定了芯片和开发板,这些也只能在 Kconfig 界面上展示,是无法配置的。扩展板倒是可以继续选择。后续等支持的开发板和解决方案丰富起来时,hb set 设置和 kconfig 界面设置需要更好的来协作。比如 hb set 可以支持一系列开发板和解决方案,具体的选择哪些开发板和解决方案,可以 kconfig 界面上来配置,hb set 只提供默认值等等。
我们来看下对应的 makefile 片段,深入了解下 Kconfig 配置的规则。⑴处可以在开发板设备下提供下配置选项,如 device\board\fnlink\v200zr\liteos_m 目录下维护 Kconfig 文件提供可定制的配置项。⑵处提供设备的公司名称用来定位构建路径等,这个配置项 config SOC_COMPANY 只提供 string 类型、prompt 提示、help 帮助信息等属性。后续在 SOC 部分的配置里,如 device\soc\bestechnic\Kconfig.liteos_m.soc,继续提供这个配置项的默认值 default 信息。Kconfig 里,运行对同一个 config 配置项多处出现。
⑶处设置扩展板 shields、⑷到⑸用于配置开发板信息,⑹到⑺用于配置芯片族和芯片信息。下文分别详细分析。
5.1 扩展板配置
上面的小节中"../../device/board/*/Kconfig.liteos_m.shields"用于配置扩展板信息,使用*通配符匹配所有的扩展板,可以将所有扩展板配置信息都加载进来。设计者认为不同单板厂商的扩展板可以兼容使用吧。还比较有意思的是,Kconfig 文件采用 liteos_m.shields 作为后缀,一方面指明内核类型,又指明是扩展板的配置。fnlink 的扩展板设置路径为 device\board\fnlink\Kconfig.liteos_m.shields,其内容如下。可以看到又进一步包含 shields 目录下面 Kconfig.liteos_m.shields。
文件 device\board\fnlink\shields\Kconfig.liteos_m.shields 的内容如下:⑴处为各个开发板的默认配置项取值,界面上不会显示。⑵处用于展示,并让开发者界面上选择需要的开发板。选择开发板时,对应的一些依赖配置项会被打开,可以自行参考文件 device\board\fnlink\shields\v200zr-evb-t1\Kconfig.liteos_m.shield。
下面附上 fnlink 扩展板目录 shields 下相关的文件信息:
5.2 开发板配置
文件"../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.defconfig.boards"提供指定公司的开发板的默认配置项信息,如文件 device\board\fnlink\Kconfig.liteos_m.defconfig.boards 内容如下,又进一步引入公司各个开发板的默认配置项信息,可以具体查看文件 device\board\fnlink\v200zr\Kconfig.liteos_m.defconfig.board 了解下公司开发板默认配置项信息。默认配置项信息不会在配置界面上进行展示。
文件"../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.boards"提供指定公司开发板的配置项信息,如文件 device\board\fnlink\Kconfig.liteos_m.boards 的配置项如下,又进一步引入公司各个开发板的默认配置项信息,可以具体查看文件 device\board\fnlink\v200zr\Kconfig.liteos_m.board 了解下公司开发板配置项信息。这些配置项用于在界面上供开发者选择所需的开发板。因为开发板依赖 SoC 配置项,SoC 在 hb set 时已经确认,这里的配置在界面上只起到展示作用,开发者并不能进行选择配置,这块预计后续会继续优化。
device\board\fnlink\v200zr\Kconfig.liteos_m.board 内容如下:
5.3 芯片配置
文件"../../device/soc/*/Kconfig.liteos_m.defconfig"提供芯片系列的默认配置项信息,如文件 device\soc\bestechnic\Kconfig.liteos_m.defconfig 内容如下,又进一步把各个芯片型号的默认配置信息引入进来,如 device\soc\bestechnic\bes2600\Kconfig.liteos_m.defconfig.series。
在"SoC Series Selection"Soc 系列选择项中,使用的"../../device/soc/*/Kconfig.liteos_m.series"会把 SoC 各个系列的配置项引入进来,如 device\soc\bestechnic\Kconfig.liteos_m.series,文件内容如下,会进一步把文件 device\soc\bestechnic\bes2600\Kconfig.liteos_m.series 引入进来。细心的同学可能已经注意到,文件 Kconfig.liteos_m.series 在目录 bestechnic 和目录 bestechnic\bes2600 下都有,属于同名文件。所以,Kconfig 中的路径通配符*只通配了一级目录。
SoC 和 SoC Serial 的配置项类似,可以自行查看。
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/d4bcb19b5232d1f0f21574cc4】。文章转载请联系作者。
评论