写点什么

带你熟悉鸿蒙轻内核 Kconfig 使用指南

  • 2021 年 12 月 28 日
  • 本文字数:5893 字

    阅读完需:约 19 分钟

摘要:本文介绍了 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 接收额外的参数,比如:


make menuconfig args="--help"
复制代码


​通过 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 版本的产品配置文件。


ifeq ($(TEE:1=y),y)tee = _teeendififeq ($(RELEASE:1=y),y)CONFIG ?= $(PRODUCT_PATH)/kernel_configs/release$(tee).configelseCONFIG ?= $(PRODUCT_PATH)/kernel_configs/debug$(tee).configendif
KCONFIG_CONFIG ?= $(CONFIG)
复制代码


2.2 menuconfig 内核配置


使用 make menuconfig 进行内核配置,Makefile 源码片段如下:


update_config menuconfig:	$(HIDE)test -f "$(CONFIG)" && cp -v "$(CONFIG)" .config && menuconfig $(args) && savedefconfig --out "$(CONFIG)"
复制代码


​可以看出,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 配置。命令如下:


make update_config RELEASE=1make update_config TEE=1
复制代码


​另外,如果想手动指定产品配置,而不是自动使用 hb set 时所选择的产品的配置,则可以使用 CONFIG=/path/to/the/xx.config 参数,如:


make update_config CONFIG=../../vendor/hisilicon/hispark_aries/config/release.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 文件中会使用这些环境变量。


 ohos_kernel ?= liteos_m⑴  $(foreach line,$(shell hb env | sed 's/\[OHOS INFO\]/ohos/g;s/ /_/g;s/:_/=/g' || true),$(eval $(line)))⑵  ifneq ($(ohos_kernel),liteos_m)    $(error The selected product ($(ohos_product)) is not a liteos_m kernel type product)    endif
⑶ ifeq ($(PRODUCT_PATH),) PRODUCT_PATH:=$(ohos_product_path) endif
ifeq ($(DEVICE_PATH),) DEVICE_PATH:=$(ohos_device_path) endif
ifeq ($(BOARD_COMPANY),) BOARD_COMPANY:=$(ohos_device_company) endif ...⑷ export BOARD_COMPANY export DEVICE_PATH export PRODUCT_PATH
复制代码


​hb env 的输出类似如下:


[OHOS INFO] root path: /home/zhushy/openharmony[OHOS INFO] board: v200zr[OHOS INFO] kernel: liteos_m[OHOS INFO] product: iotlink_demo[OHOS INFO] product path: /home/zhushy/openharmony/vendor/bestechnic/iotlink_demo[OHOS INFO] device path: /home/zhushy/openharmony/device/board/fnlink/v200zr/liteos_m[OHOS INFO] device company: fnlink
复制代码


​执行 shell 命令 hb env | sed 's/\[OHOS INFO\]/ohos/g;s/ /_/g;s/:_/=/g'的输出如下:


ohos_root_path=/home/zhushy/openharmonyohos_board=v200zrohos_kernel=liteos_mohos_product=iotlink_demoohos_product_path=/home/zhushy/openharmony/vendor/bestechnic/iotlink_demoohos_device_path=/home/zhushy/openharmony/device/board/fnlink/v200zr/liteos_mohos_device_company=fnlink
复制代码


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、⑷到⑸用于配置开发板信息,⑹到⑺用于配置芯片族和芯片信息。下文分别详细分析。


# Device Kconfig import⑴  osource "$(DEVICE_PATH)/Kconfig"
⑵ config SOC_COMPANY string "SoC company name to locate soc build path" help This option specifies the SoC company name, used to locate the build path for soc. This option is set by the SoC's Kconfig file, and should be exactly the same with SoC company path, and the user should generally avoid modifying it via the menu configuration.
⑶ orsource "../../device/board/*/Kconfig.liteos_m.shields"
⑷ orsource "../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.defconfig.boards"
choice prompt "Board Selection"
orsource "../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.boards"
⑸ endchoice
⑹ orsource "../../device/soc/*/Kconfig.liteos_m.defconfig"
choice prompt "SoC Series Selection"
orsource "../../device/soc/*/Kconfig.liteos_m.series"
endchoice
⑺ orsource "../../device/soc/*/Kconfig.liteos_m.soc"
复制代码


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。


orsource "shields/Kconfig.liteos_m.shields"
复制代码


​文件 device\board\fnlink\shields\Kconfig.liteos_m.shields 的内容如下:⑴处为各个开发板的默认配置项取值,界面上不会显示。⑵处用于展示,并让开发者界面上选择需要的开发板。选择开发板时,对应的一些依赖配置项会被打开,可以自行参考文件 device\board\fnlink\shields\v200zr-evb-t1\Kconfig.liteos_m.shield。


⑴  orsource "*/Kconfig.liteos_m.defconfig.shield"
choice prompt "shield Selection"
⑵ orsource "*/Kconfig.liteos_m.shield"
endchoice
复制代码


​下面附上 fnlink 扩展板目录 shields 下相关的文件信息:


shields├── BUILD.gn├── Kconfig.liteos_m.shields├── v200zr-evb-t0│   ├── BUILD.gn│   ├── Kconfig.liteos_m.defconfig.shield│   ├── Kconfig.liteos_m.shield└── v200zr-evb-t1    ├── BUILD.gn    ├── Kconfig.liteos_m.defconfig.shield    ├── Kconfig.liteos_m.shield
复制代码


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 了解下公司开发板默认配置项信息。默认配置项信息不会在配置界面上进行展示。


orsource "*/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 时已经确认,这里的配置在界面上只起到展示作用,开发者并不能进行选择配置,这块预计后续会继续优化。


orsource "*/Kconfig.liteos_m.board"
复制代码


​device\board\fnlink\v200zr\Kconfig.liteos_m.board 内容如下:


config BOARD_V200ZR    bool "select board V200Z-R"    depends on SOC_BES2600W
复制代码


5.3 芯片配置


文件"../../device/soc/*/Kconfig.liteos_m.defconfig"提供芯片系列的默认配置项信息,如文件 device\soc\bestechnic\Kconfig.liteos_m.defconfig 内容如下,又进一步把各个芯片型号的默认配置信息引入进来,如 device\soc\bestechnic\bes2600\Kconfig.liteos_m.defconfig.series。


rsource "*/Kconfig.liteos_m.defconfig.series"
config HALS_COMMUCATION_WIFI_LITE bool "WIFI LITE" default y
复制代码


​在"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 中的路径通配符*只通配了一级目录。


rsource "*/Kconfig.liteos_m.series"
复制代码


​SoC 和 SoC Serial 的配置项类似,可以自行查看。


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
带你熟悉鸿蒙轻内核Kconfig使用指南