linux驱动开发学习笔记九:menuconfig过程详解

当我们执行make menuconfig时,系统到底帮我们做了什么?

这里面一共涉及到了以下几个文件,下面我们逐个的讲解:

  • Linux内核根目录下的scripts文件夹

  • arch/$ARCH/Kconfig文件、各层目录下的Kconfig文件

  • Linux内核根目录下的makefile文件、各层目录下的makefile文件

  • Linux内核根目录下的的.config文件、arch/$ARCH/下的 .config文件

  • Linux内核根目录下的 include/generated/autoconf.h文件

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

二、当我们执行make menuconfig命令出现蓝色配置界面以前,系统帮我们做了以下工作:

  • 系统会读取arch/$ARCH/目录下的Kconfig文件生成整个配置界面选项(Kconfig是整个linux配置机制的核心)

那么ARCH环境变量的值等于多少呢?它是由linux内核根目录下的makefile文件决定的,在makefile下有此环境变量的定义:
在这里插入图片描述
或者通过 make ARCH=arm menuconfig命令来生成配置界面,默认生成的界面是所有参数都是没有值的.

比如教务处进行考试,考试科数可能有外语、语文、数学等科,这里相当于我们选择了arm科可进行考试,系统就会读取arch/arm/Kconfig文件生成配置选项。系统还提供了x86科mips科等很多门功课的考试题。

扫描二维码关注公众号,回复: 11264347 查看本文章

三、假设教务处比较“仁慈”,还给我们准备了一份参考答案(默认配置选项),存放在arch/$ARCH/configs下,对于arm科来说就是arch/arm/configs文件夹:
在这里插入图片描述
此文件夹中有许多选项,系统会读取哪个呢?

内核默认会读取linux内核根目录下.config文件作为内核的默认选项(试题的参考答案),我们一般会根据开发板的类型从中选取一个与我们开发板最接近的系列到Linux内核根目录下(选择一个最接近的参考答案)

cp arch/arm/configs/s3c2410_defconfig .config

四、config

假设教务处留了一个心眼,他提供的参考答案并不完全正确(.config文件与我们的板子并不是完全匹配),这时我们可以选择直接修改.config文件然后执行make menuconfig命令读取新的选项。

但是一般我们不采取这个方案,我们选择在配置界面中通过空格Esc回车选择某些选项选中或者不选中,最后保存退出的时候,Linux内核会把新的选项(正确的参考答案)更新到.config中,此时我们可以把.config重命名为其它文件保存起来(当你执行make distclean时系统会把.config文件删除),以后我们再配置内核时就不需要再去arch/arm/configs下考取相应的文件了,省去了重新配置的麻烦,直接将保存的.config文件复制为.config即可。

五、经过以上的步骤,我们就可以正确的读取、配置我们需要的界面了

那么他们如何跟makefile文件建立编译关系呢?

当你保存make menuconfig选项时,系统除了会自动更新.config外,还会将所有的选项以宏的形式保存在Linux内核根目录下的 include/generated/autoconf.h文件下
在这里插入图片描述
内核中的源代码都会包含以上.h文件,根据宏的定义情况进行条件编译。当我们需要对一个文件有选择是否编译的功能时,还需要修改对应的makefile文件,例如:在这里插入图片描述
我们选择是否要编译s3c2410_ts.c这个文件时,makefile会根据CONFIG_TOUCHSCREEN_S3C2410来决定是编译此文件,此宏是在Kconfig文件中定义,当我们配置完成后,会出现在.configautoconf.h中。至此,以上列举出来的文件我们都已经提到了。

六、总结
最后我们会发现,整个linux内核配置过程中,留给用户的接口其实只有各层Kconfigmakefile文件以及对应的源文件。比如我们如果想要给内核增加一个功能,并且通过make menuconfig控制其生成过程:

  • 首先需要做的工作是:修改对应目录下的Kconfig文件,按照Kconfig语法增加对应的选项
  • 其次执行make menuconfig选择编译进内核或者不编译进内核,或者编译为模块,.config文件和autoconf.h文件会自动生成;
  • 最后修改对应目录下的makefile文件完成编译选项的添加
  • 最后的最后执行make zImage命令进行编译

猜你喜欢

转载自blog.csdn.net/qq_39507748/article/details/105788314