Linux系统移植menuconfig 原理分析

网友投稿 1285 2022-05-30

文章目录

linux系统移植:menuconfig 原理分析

一、make menuconfig 执行过程

二、Kconfig 语法

2.1 mainmenu 菜单

2.2 调用其他目录 Kconfig

2.3 menu/endmenu 条目

2.4 config 条目

2.5 depends on 和 select

2.6 choice/endchoice 条目

2.7 menuconfig

2.8 comment

2.9 source

三、自定义 menuconfig 菜单

Linux系统移植:menuconfig 原理分析

一、make menuconfig 执行过程

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

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

Linux系统移植:menuconfig 原理分析

1

2

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

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

1

看一下 menuconfig 函数

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

1

2

参数传入进去:

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

1

2

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 中代码配置如下:

参数是 uboot 的菜单名称:

2.2 调用其他目录 Kconfig

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

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

1

Kconfig 后面有相关的代码段

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

2.3 menu/endmenu 条目

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

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

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

2.4 config 条目

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

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

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

config 规范以一段代码解释:

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"

1

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

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

2.5 depends on 和 select

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

这段代码中有 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 结尾的代码段,该代码段定义了一组可选择项,将多个类似的配置项组合在一起,供用户单选或者多选,部分代码如下:

选项如下:

2.7 menuconfig

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

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

2.8 comment

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

*** Generic NAND options ***

1

界面如下:

2.9 source

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

source "arch/Kconfig"

1

三、自定义 menuconfig 菜单

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

在主界面中添加一个配置项为 JECKXU_Config_Test

配置项的为变量类型为 string

设置配置项的帮助内容为 test

编写代码如下:

config JECKXU_Config_Test string "JECKXU_Config_Test" help test

1

2

3

4

配置项:

帮助内容:

给字符串添加值

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

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

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

IDE Linux

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【技术方案分享】华为云OBS&RDS开发实战-java版(下篇)
下一篇:手把手教物体检测——yolov3
相关文章