天天看点

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

摘要:本文介绍了Kconfig的基础知识,和鸿蒙轻内核的图形化配置及进阶的使用方法。

本文分享自华为云社区《鸿蒙轻内核Kconfig使用笔记》,作者: zhushy。

Kconfig语言定义了一套完整的规则来表述配置项及配置项间的关系,详细内容可以参考Linux官方文档Kconfig Language,此处不赘述。鸿蒙轻内核使用的是Python的开源三方库kconfiglib(menuconfig只是其提供的命令之一,相关命令还有genconfig, savedefconfig等等),官方主页为https://pypi.org/project/kconfiglib。

Kconfig是配置项的描述文件,支持设置配置项及其默认值,依赖关系等等,比如kernel\liteos_a\Kconfig,该文件还会继续依赖各个模块的Kconfig文件。

产品配置文件,如vendor\hisilicon\hispark_taurus\kernel_configs\debug.config,提供配置项及在产品中这些配置项的设置值,可能和内核配置项的默认取值不一致,属于产品对内核配置项的定制。这些配置文件在BUILD.gn或makefile文件中使用。

另外还会生成一个C语言头文件,提供配置项的宏定义版,在C语言程序中使用。

下载OpenHarmony源代码后,使用hb set设置产品解决方案后,然后在kernel/liteos_m或liteos_a目录下执行make help可获得一个总体的帮助说明,如下图所示:

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

其中与Kconfig有关的为xxconfig类目标,这类目标通过args接收额外的参数,比如:

通过args="–help"就可以了解xxconfig类命令的使用详细说明。

支持的参数有文件类型FSTYPE,版本类别TEE、RELEASE等版本,默认为DEBUG版本。还支持通过CONFIG参数指定产品配置文件路径,该参数优先级较高。

注意:OpenHarmony支持使用ninja+gn来编译构建,内核使用的kconfig配置工具依旧使用makefile进行维护的。

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。

上文,我们知道了make menuconfig支持参数,我们详细看下代码。文件位置在kernel/liteos_a/Makefile,代码片段如下:

如果指定了CONFIG参数,则使用用户指定的产品配置文件。如果开启了TEE,则使用TEE版本的产品配置文件。如果开启了RELEASE,则使用release版本产品配置文件,否则使用debug版本的产品配置文件。

使用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参数,如:

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>

我们知道在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文件中会使用这些环境变量。

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

在执行make menuconfig,进入platform配置路径后,可以看到如下图所示的配置界面,支持对扩展板、单板、芯片系列等配置。总体感觉这块后续应该还需要继续优化调整。hb set设置产品解决方案时,已经确定了芯片和开发板,这些也只能在Kconfig界面上展示,是无法配置的。扩展板倒是可以继续选择。后续等支持的开发板和解决方案丰富起来时,hb set设置和kconfig界面设置需要更好的来协作。比如hb set可以支持一系列开发板和解决方案,具体的选择哪些开发板和解决方案,可以kconfig界面上来配置,hb set只提供默认值等等。

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

我们来看下对应的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/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下相关的文件信息:

文件"../../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内容如下:

文件"../../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的配置项类似,可以自行查看。

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