摘要:本文介绍了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 = _tee
endif
ifeq ($(RELEASE:1=y),y)
CONFIG ?= $(PRODUCT_PATH)/kernel_configs/release$(tee).config
else
CONFIG ?= $(PRODUCT_PATH)/kernel_configs/debug$(tee).config
endifKCONFIG_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=1
make 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)endififeq ($(DEVICE_PATH),)DEVICE_PATH:=$(ohos_device_path)endififeq ($(BOARD_COMPANY),)BOARD_COMPANY:=$(ohos_device_company)endif...
⑷  export BOARD_COMPANYexport DEVICE_PATHexport 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/openharmony
ohos_board=v200zr
ohos_kernel=liteos_m
ohos_product=iotlink_demo
ohos_product_path=/home/zhushy/openharmony/vendor/bestechnic/iotlink_demo
ohos_device_path=/home/zhushy/openharmony/device/board/fnlink/v200zr/liteos_m
ohos_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_COMPANYstring "SoC company name to locate soc build path"helpThis option specifies the SoC company name, used to locate the build path for soc. This option is set by theSoC's Kconfig file, and should be exactly the same with SoC company path, and the user should generally avoidmodifying it via the menu configuration.⑶  orsource "../../device/board/*/Kconfig.liteos_m.shields"⑷  orsource "../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.defconfig.boards"choiceprompt "Board Selection"orsource "../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.boards"⑸  endchoice⑹  orsource "../../device/soc/*/Kconfig.liteos_m.defconfig"choiceprompt "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"choiceprompt "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_V200ZRbool "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_LITEbool "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的配置项类似,可以自行查看。

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

带你熟悉鸿蒙轻内核Kconfig使用指南相关推荐

  1. 从五大结构体,带你掌握鸿蒙轻内核动态内存Dynamic Memory

    摘要:本文带领大家一起剖析了鸿蒙轻内核的动态内存模块的源代码,包含动态内存的结构体.动态内存池初始化.动态内存申请.释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列九 动态内存Dyna ...

  2. 事件Event:带你体验鸿蒙轻内核中一对多、多对多任务同步

    摘要:本文通过分析鸿蒙轻内核事件模块的源码,深入掌握事件的使用. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十二 事件Event>,原文作者:zhushy . 事件(Event)是一 ...

  3. 带你剖析鸿蒙轻内核任务栈的源代码

    摘要:本文带领大家一起学习了鸿蒙轻内核的任务栈.任务上下文的基础概念,剖析了任务栈初始化的代码. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列七 任务及任务调度(1)任务栈>,原文作者 ...

  4. 鸿蒙轻内核的得力助手:带你掌握4种内存调试方法

    摘要:内存调测方法旨在辅助定位动态内存相关问题,提供了内存池信息统计.内存泄漏检测和踩内存检测三种调测手段. 本文分享自华为云社区<鸿蒙轻内核-内存调测-内存信息统计>,作者:zhushy ...

  5. 鸿蒙轻内核虚拟内存基础知识:虚拟内存进程空间编号

    摘要:本文介绍了OpenHarmony鸿蒙轻内核LiteOS-A的虚拟地址空间编号知识,详细分析进程空间编号的申请与释放操作. 本文分享自华为云社区<鸿蒙轻内核A核源码分析系列四 (1) 虚拟内 ...

  6. 万字解读鸿蒙轻内核物理内存模块

    摘要:本文首先了解了物理内存管理的结构体,接着阅读了物理内存如何初始化,然后分析了物理内存的申请.释放和查询等操作接口的源代码. 本文分享自华为云社区<鸿蒙轻内核A核源码分析系列三 物理内存&g ...

  7. MPU:鸿蒙轻内核的任务栈的溢出检察官

    摘要:MPU(Memory Protection Unit,内存保护单元)把内存映射为一系列内存区域,定义这些内存区域的维洲,大小,访问权限和内存熟悉信息. 本文分享自华为云社区<鸿蒙轻内核M核 ...

  8. 从结构体、内存池初始化到申请释放,详细解读鸿蒙轻内核的动态内存管理

    摘要:本文带领大家一起剖析了鸿蒙轻内核的动态内存模块的源代码,包含动态内存的结构体.动态内存池初始化.动态内存申请.释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列九 动态内存Dyna ...

  9. 鸿蒙轻内核源码分析:文件系统LittleFS

    摘要:本文先介绍下LFS文件系统结构体的结构体和全局变量,然后分析下LFS文件操作接口. 本文分享自华为云社区<# 鸿蒙轻内核M核源码分析系列二一 02 文件系统LittleFS>,作者: ...

最新文章

  1. 文本查重:difflib.SequenceMatcher
  2. autorunner测试java代码,AutoRunner自动化测试工具介绍
  3. Serverless Devs 2.0 开箱测评:Serverless 开发最佳实践
  4. 一个DDOS病毒的分析(一)
  5. SAP UI5 Routing 路由介绍
  6. 使用SALT-API进入集成开发的简单样例
  7. PyTorch 系列 | 数据加载和预处理教程
  8. 细粒度权限控制 linux,利用docker插件实现细粒度权限控制
  9. 超详细前端开发案例:品优购商场项目(三)
  10. verilog找不到模块_工欲善其事,必先利其器 verilog编辑器搭建
  11. 腾讯微信支付支持全量商家小程序场景开通云闪付功能
  12. js动态生产table、Div、select
  13. apk反汇编之smali语法
  14. 学习爬虫第二天:继续爬公司内部的通讯录
  15. 银河麒麟系统10服务器安装教程,麒麟系统下安装win10的详细教程
  16. 求助 NVIDIA GeForce experience安装失败
  17. 然而,随着下属人数的增多,下属各自 开始形成自己的权力主体。
  18. 【AI框架】MMDetection3D 使用指南
  19. mac系统的alt+tab(切换程序)键是什么
  20. 史上最超级KB的10个故事~你撑到第几个才发抖

热门文章

  1. linux里gpl_GPL实施,ONOS与Linux Foundation合作以及更多新闻
  2. 开源图书馆系统Evergreen奖励社区
  3. (21)css3盒模型box-sizing属性
  4. 垃圾回收 | Java垃圾回收,这杯咖啡,不仅好喝,而且实用!
  5. DJL | DJL 如何正确打开 [ 深度学习 ]
  6. Bootstrap 导航
  7. Bootstrap 排版列表
  8. android基础入门思考题答案,《Android移动应用基础教程》中国铁道出版社课后习题(附答案)...
  9. 三.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---1.项目文件介绍(除主要源码部分)
  10. php 如何让html表单当中的数据在修改mysql的时候自动变更_怎么用php把html表单内容写入数据库?...