make menuconfig内核配置加载过程

项目工程要修改编译架构,通过内核配置文件来,控制模块功能编译,给客户提供一个可定制版的版本。搞定负责模块的配置后,也把这个执行过程梳理了下,分享一下:
make ARCH=arm menuconfig为例

$ARCH由linux内核根目录下的makefile文件决定,这里用的arm架构。

1、执行顶层的Makefile

由于定义了KBUILD_EXTMOD,将执行config。

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

这里: ( b u i l d ) = s c r i p t s / k c o n f i g , b u i l d 是 编 译 规 则 , (build) =scripts/kconfig,build是编译规则, (build)=scripts/kconfigbuild(build) =scripts/kconfig实质是:-f scripts/kconfig/Makefile
那么翻译过来有:

    $(Q)$(MAKE) $(build)=scripts/kconfig $@ 
==> make -f scripts/kconfig/Makefile  menuconfig

-f:指定执行某个Makefile文件,表示到scripts/kconfig目录下Makefile文件中,生成目标menuconfig

2、scripts/kconfig/Makefile

找到规则目标所在的代码:

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

其中:
obj := $(CURDIR)
Kconfig :=arch/$(SRCARCH)/Kconfig
SRCARCH := $(ARCH) //这里ARCH=arm

所以有:

menuconfig: scripts/kconfig/mconf
      scripts/kconfig/mconf  arch/arm/Kconfig

另:这里也有xconfig、config、gconfig等匹配规则

3、小结

当我们执行命令make menuconfig时, 把scripts/kconfig/里面的可执行文件mconf运行起来,有能力的话可以详看scripts/kconfig/mconf.c,根据arch/arm/kconfig内容,显示出菜单界面。
其实,mconf运行起来,首先是“画出”菜单界面(显示内容则根据各级目录的Kconfig文件),然后查看当前目录有没有存在.config文件,若没有,则按照默认显示到菜单里面;若存在.config,则会把它读出来存到内存某块区域,在逐行逐行解析它的内容,再把读出的内容更新到菜单。

最后会保存在.config文件(当前目录中)。

4、如何添加Kconfig配置文件

scripts文件夹存放的是跟make menuconfig配置界面的图形绘制相关的文件,我们作为使用者无需关心这个文件夹的内容。

kconfig的总入口是arch/arm/kconfig,不是源码顶层的kconfig,入口一定是根据某款平台的,例如我们使用的就是下面这配置。

linux-4.19.136/arch/arm/Kconfig

对于使用者来说如何将自己开发的模块通过Kconfig来控制编译选项呢?首先了解下Kconfig的三种类型:

当执行make ARCH=arm menuconfig时,进入界面

这里的内容来自linux-4.19.136/Kconfig。通过source链接到下级的Kconfig文件。

(1)菜单选项

菜单选项不是代表某种功能,只有进去菜单里面,才能选择功能属性,意义不大。比如我添加一个helloworld的菜单。就要先在linux-4.19.136/Kconfig下,包含我自己的Kconfig文件。

如何写一个写一个菜单Kconfig文件呢?很简单,打开一个参考下就OK了。以文件系统为例(fs/Kconfig),如果有下级配置,可以source下级的Kconfig文件。

格式:

menu “xxxxxx”
……
……
endmenu

(2)定义一个功能属性选项

一个功能属性对应一块代码。定义的功能属性最好放在菜单选项里面,也就是菜单的Kconfig里。

如直接添加一个功能属性 hello

格式:

config  XXX  (XXX是宏) 
  bool (二态,01,后面带提示内容。ps:tristate是三态)
  default  y                 (y默认是选中的,n默认则是不选)
  select  宏1                ( 要是当前的功能属性选上,则宏1代表的功能属性一定自动选上,用户不能修改。 )  
  depend on 宏 2         ( 当前功能属性依赖于宏2的功能属性,若宏2功能属性没有选上,则当前功能选项不能显示出来。)
  help  帮助信息
  xxxxxxx

(3)导入下级目录的Kconfig

source “xxx/xxx/kconfig”

下级的xxx/xxx/Kconfig文件中
格式

menu “xxxxxx”
  config HAVE_PWM
  bool
  source “xxx/xxx/kconfig”
  help
    xxxxxxxxxx
endmenu

写的有点乱,有什么疑问可以评论区一起讨论。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值