kernel——make menuconfig的实现原理【转】

转自:https://blog.csdn.net/hpr1992/article/details/41048693

复制代码
1、系统移植可以分为配置系统和编译系统两大块,其中通过命令makemenuconfig进行图形化界面配置的步骤为配置系统。

2、内核源码包中,不同的目录收集不同的代码块,要通过配置系统将“有用”的代码块“挑选”出来,以便给后续的编译系统编译。


要弄清make menuconfig命令的实现原理,通过以下问题的答案就可以知道。

一、“配置菜单界面”是如何出来的?

执行make menuconfig的时候,会执行顶层的Makefile,

[cpp] view plain copy

    %config: scripts_basic outputmakefile FORCE  
        $(Q)mkdir -p include/linux include/config  
        $(Q)$(MAKE) $(build)=scripts/kconfig $@  


注意:$(build) =scripts/kconfig,build是编译规则,$(build) =scripts/kconfig实质是:-f scripts/kconfig/Makefile

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

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


接下来,scripts/kconfig/Makefile找到目标所在的代码:

[cpp] view plain copy

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

obj          := $(CURDIR)

Kconfig            :=arch/$(SRCARCH)/Kconfig

SRCARCH := $(ARCH)

而ARCH变量在顶层目录的Makefile中早已赋值arm

所以:
[cpp] view plain copy

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

当我们执行命令make menuconfig时,(1)先创建两个二级目录include /linux 和 include/config,(2)接着

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

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


二、kconfig文件的语法分析?

kconfig的总入口是arch/arm/kconfig,不是源码顶层的kconfig,入口一定是根据某款平台的。

概括起来,kconfig的用法有三种:

(1)添加一个菜单选项,菜单选项不是代表某种功能,只有进去菜单里面,才能选择功能属性,意义不大。

如添加一个helloworld菜单。


格式:

menu “xxxxxx”
……

……
endmenu


(2)定义一个功能属性选项,一个功能属性对应一块代码。定义的功能属性最好放在菜单选项里面。

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

格式:

config HAVE_PWM     

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


(3)导入别的目录的Kconfig

source “xxx/xxx/kconfig”
可以这样用法:

menu “xxxxxx”

config HAVE_PWM

bool

source “xxx/xxx/kconfig”

endmenu
复制代码

 

posted @   Sky&Zhang  阅读(2364)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
历史上的今天:
2017-06-14 Linux网络编程一步一步学【转】
2017-06-14 V4L2驱动的移植与应用(二+三)【转】
2017-06-14 基于V4L2的视频驱动开发【转】
2017-06-14 常用牛人主页链接(计算机视觉、模式识别、机器学习相关方向,陆续更新。。。。)【转】
点击右上角即可分享
微信分享提示