你可能保存.congfig文件的方法一直都是错误的,教你正确地保存编译内核产生的.config文件
可能一直以来保存编译内核生成的.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设备驱动调试移植的一些套路