查看原文
其他

你可能保存.congfig文件的方法一直都是错误的,教你正确地保存编译内核产生的.config文件

2017-11-06 嵌入式ARM 嵌入式ARM

可能一直以来保存编译内核生成的.config文件都是cp .config arch/arm/configs/xxx_defconfig来保存的。但是这其实是一个错误的方法。不信?今天我们来深究一下这个问题。


以前我一直没有在意过这个问题,直到遇到了make xxx_defconfig生成的.config与原xxx_defconfig有差异并解决后,引发的对.config保存方式的疑惑。原来在arch/arm/configs/中保存的默认xxx_defconfig文件并不是一个完整的.config文件。其实执行过make xxx_defconfig后产生的.config会比原来的多近2000行配置。这些配置在执行make xxx_defconfig自动添加进去的。

 

一些通用的内容并不会保存,怎样剔出掉这些在.config通用的内容?内核中提供了make savedefconfig这个命令。

savedefconfig   - Save current config as ./defconfig (minimal config)

    

From: https://www.kernel.org/doc/makehelp.txt


这样做的优点相当多了就,节省空间以至于Linux内核的代码量不会太大,第二对比差异的时候好对比一些。更重要的是这个是一个正统的方式。完整命令:

 $ make savedefconfig && mv defconfig arch/arm/configs/xxx_defconfig


以下是make xxx_defconfig生成的.config与原xxx_defconfig有差异的内容:


接到的厂商发的kernel指定的配置文件是xxx_defconfig,仅仅是执行了make xxx_defconfig生成的.config就和xxx_defconfig就有差别。以前没有在意过这个问题,这次从头开发一个内核的时候出现如题的问题。很诡异,添加自己的配置后还要保存这个.config呢?为什么我还没有添加的任何配置的时候就出现的不同。这点着实让我很不理解。


对比测试方法是使用学习时mini2440开发版本配置mini2440_defconfig也两样会出现这个问题。这些东西是在哪里添加的,我大概推测是Makefile中添加的,但是又不确定,有没有人研究过?


以前学习MIni2440的时候都是copy mini2440_defconfig .config来进行生成的.config,使用make mini2440_defconfig原来经历的过程要麻烦的多。如下:


[python] view plain copy

1.$ make mini2440_defconfig -n  

2.make -f scripts/Makefile.build obj=scripts/basic  

3.:  

4.rm -f .tmp_quiet_recordmcount  

5.mkdir -p include/linux include/config  

6.make -f scripts/Makefile.build obj=scripts/kconfig mini2440_defconfig  

7.set -e;  echo '  HOSTLD  scripts/kconfig/conf'; gcc  -o scripts/kconfig/conf scripts/kconfig/conf.o scripts/kconfig/zconf.tab.o  ; echo 'cmd_scripts/kconfig/conf := gcc  -o scripts/kconfig/conf scripts/kconfig/conf.o scripts/kconfig/zconf.tab.o  ' > scripts/kconfig/.conf.cmd  

8.scripts/kconfig/conf --defconfig=arch/arm/configs/mini2440_defconfig Kconfig  

9.$   


有点纠结了。使用这种方法还是copy的,以存在就是合理来讲make xxx_defconfig一样是一定的原因的。


再来一贴,问题找到了。两种实现结果最终是一样的,以下是验证过程,以mini2440_defconfig为例子。

[python] view plain copy

1.$ cp arch/arm/configs/mini2440_defconfig .config  

2.$ make menuconfig  

3.scripts/kconfig/mconf arch/arm/Kconfig  

4.#  

5.# configuration written to .config  

6.#  

7.   

8.   

9.*** End of Linux kernel configuration.  

10.*** Execute 'make' to build the kernel or try 'make help'.  

11.$ cp .config .config_bak  

12.$ make mini2440_defconfig  

13.#  

14.# configuration written to .config  

15.#  

16.$ diff .config .config_bak   

17.4c4  

18.< # Thu Sep 25 15:23:14 2014  

19.---  

20.> # Thu Sep 25 15:22:54 2014  

21.$  

make xxx_defconfig生成的.config可以直接make zImage,相当于copy mini2440_defconfig .config再执行make menuconfig的效果。


推荐阅读:

1.如果说linux makefile是一位蒙着面纱的美女,那么我们今天就来揭开她的面纱

2.少走弯路系列!嵌入式linux设备驱动调试移植的一些套路

3.嵌入式Linux驱动和固件有何区别?供应商是如何用固件压缩成本的?

4.初学linux 驱动开发,路漫漫其修远兮

5.单片机有最小系统,Uboot同样也有, mini-uboot 启动过程简单分析


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存