Linux系统移植:menuconfig 原理分析

Linux系统移植:menuconfig 原理分析

一、make menuconfig 执行过程

在控制台输入 make menuconfig 后最终会执行如下代码:

%config: scripts_basic outputmakefile FORCE
	$(Q)$(MAKE) $(build)=scripts/kconfig $@

其中 build=-f ./scripts/Makefile.build obj,把变量带入,展开代码

@ make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig

看一下 menuconfig 函数

menuconfig: $(obj)/mconf
	$< $(silent) $(Kconfig)

参数传入进去:

menuconfig: scripts/kconfig/mconf
	scripts/kconfig/mconf Kconfig

scripts/kconfig/mconf.c 这个文件会被编译,生成 mconf 这个可执行文件,而 mconf 会调用 uboot 根目录下的 Kconfig 文件开始构建图形配置界面,这就是 menuconfig 执行原理

二、Kconfig 语法

一中提到 mconf 根据 Kconfig 文件构建图形界面,所以要了解一下 Kconfig 的语法

Kconfig 语法有相关文档,在 linux 内核下面 Documentation/kbuild/kconfig-language.txt 有详细说明

2.1 mainmenu 菜单

mainmenu 是主菜单,输入“make menuconfig”以后打开的默认界面,Kconfig 中代码配置如下:

20220220174154

参数是 uboot 的菜单名称:

20220220180634

2.2 调用其他目录 Kconfig

Kconfig 也可以调用其他子目录中的 Kconfig 文件,方法如下:

source "xxx/Kconfig" //xxx 为相对路径目录

Kconfig 后面有相关的代码段

20220220181903

顶层 Kconfig 文件调用了其他子目录下的 Kcofig 文件,子目录下的 Kconfig 文件在主菜单中生成各自的菜单项

2.3 menu/endmenu 条目

menu 条目用于生成菜单,endmenu 则是该条目的结尾

20220220183824

整个 Kconfig 有两个 menu 菜单,子菜单 “General setup” 和子菜单 “Boot images”,在界面中如下:

20220220184046

其他的子菜单是 Kconfig 调用的其他 Kconfig 生成的

2.4 config 条目

在 menu/endmenu 代码块中有大量的 “config xxxx” 的代码块:

20220220192137

这些 config 条目其实就是子菜单的具体配置项

比如 General setup 的子菜单如下,和 config 可以对上:

20220220192649

config 规范以一段代码解释:

20220220195153

config + 名字 对应不同的配置项,config 关键字下面的几行是该配置项属性,

string 是变量类型,可以为:bool、tristate、string、hex 和 int,最常用的是 bool、tristate 和 string 这三种

  • bool 类型有两种值:y 和 n,当为 y 的时候表示使能这个配置项,当为 n 的时候就禁止这个配置项
  • tristate 类型有三种值:y、m 和 n,其中 y 和 n 的涵义与 bool 类型一样,m 表示将这个配置项编译为模块
  • string 为字符串类型,用来存储本地字符串,选中以后即可输入字符串,比如:
string "Local version - append to U-Boot release"

代码选中 “Local version - append to U-Boot release” 后就可以输入字符串报错到该变量,如下:

20220220201127

“default y” 表示默认值就是 y

2.5 depends on 和 select

打开 arch/Kconfig 文件,代码如下:

20220220201655

这段代码中有 depends on 和 select 条目:

depends on 表示 SYS_GENERIC_BOARD 依赖于 HAVE_GENERIC_BOARD,表示 HAVE_GENERIC_BOARD 被选中以后 SYS_GENERIC_BOARD 才能被选中

select 则表示关联,当选中 ARC 后,下面 select 的 4 个选项都会被关联选上

2.6 choice/endchoice 条目

arch/Kconfig 有一段 choice 开头,endchoice 结尾的代码段,该代码段定义了一组可选择项,将多个类似的配置项组合在一起,供用户单选或者多选,部分代码如下:

20220220202841

选项如下:

20220220202931

2.7 menuconfig

menuconfig 和 menu 类似,但 menuconfig 比子菜单还多了选项的功能,顶层 Kconfig 中有如下代码:

20220220203816

这段代码定义了一个可选的菜单 EXPERT,只有 Y 选中了 EXPERT,然后 Enter 进入了 EXPERT,才会进一步显示 if 到 endif 的选项,否则进入了则一片空白,这就是 menuconfig 的功能

2.8 comment

comment 用于注释,比如在配置项 Configure Arasan Nand 下面有一行注释,注释内容为

*** Generic NAND options ***

界面如下:

20220220205641

2.9 source

source 前面有提到,用于读取另一个 Kconfig,比如:

source "arch/Kconfig"

三、自定义 menuconfig 菜单

图形化配置工具的主要工作就是在 .config 下面生成前缀为 “CONFIG_” 的变量,这些变量一般会有一个值,为 y,m 或 n,然后 uboot 源码里面会根据这些变量来决定编译对应的文件,我们也可以自定义菜单,编译自己的代码,我们自定义一个菜单,菜单属性如下:

  • 在主界面中添加一个配置项为 JECKXU_Config_Test
  • 配置项的为变量类型为 string
  • 设置配置项的帮助内容为 test

编写代码如下:

config JECKXU_Config_Test
	string "JECKXU_Config_Test"
	help
	  test

配置项:

20220220212033

帮助内容:

20220220212254

给字符串添加值

20220220212331

然后 save 配置的值到 .config,可以看到写入成功

20220220212526

我们可以在进一步根据 CONFIG 的内容编译我么需要的代码,达到我们自定义配置的效果

到此 uboot 图形化配置界面基本结束,一般不用图形化界面来配置 uboot 功能,主要还是靠修改代码来配置 uboot 功能

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Top嵌入式

投喂个鸡腿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值