Linux系统移植:menuconfig 原理分析

举报
JeckXu666 发表于 2022/02/22 00:21:58 2022/02/22
【摘要】 文章目录 Linux系统移植:menuconfig 原理分析一、make menuconfig 执行过程二、Kconfig 语法2.1 mainmenu 菜单2.2 调用其他目录 Kconfig2...

Linux系统移植:menuconfig 原理分析

一、make menuconfig 执行过程

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

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

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

20220220174154

参数是 uboot 的菜单名称:

20220220180634

2.2 调用其他目录 Kconfig

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

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

  
 
  • 1

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"

  
 
  • 1

代码选中 “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 ***

  
 
  • 1

界面如下:

20220220205641

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

配置项:

20220220212033

帮助内容:

20220220212254

给字符串添加值

20220220212331

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

20220220212526

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

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

文章来源: blog.csdn.net,作者:JeckXu666,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_45396672/article/details/123036382

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。