内核配置保存

事由

  • 调试开发板,想在sigmastar提供的内核配置上做些修改,去掉一些不需要的配置,保存一份自定义的配置,但是配置过程中出现了一些异常和疑惑,理解后,特记录下。

异常

  • sigmastar提供的默认配置和编译命令,如下:
declare -x ARCH="arm"
declare -x CROSS_COMPILE="arm-buildroot-linux-uclibcgnueabihf-"

make infinity6_cardv_defconfig //使用配置infinity6_cardv_defconfig
make
  • 执行命令make infinity6_cardv_defconfig时,根据打印信息可以确认,编译脚本会根据arch/arm/configs/infinity6_cardv_defconfig配置文件生成当前配置.config。
  • 问题:
  1. 通过对比.config和infinity6_cardv_defconfig,发现.config多了一些配置,一些本不该存在的配置,例如:mouse鼠标的配置等。
  2. 即使是手动将infinity6_cardv_defconfig配置文件拷贝为.config,再执行一次make menuconfig,.config中也会多出一些不该存在的配置。
  • 疑惑:当前设备使用的内核就是以这种方式编译出来的,但是为何有些不该存在的配置,这些配置不会导致问题吗?再一次修改后,编译的内核能用吗?

解决

  • 查阅了一些博客后,问题得以理解。
  • 内核配置文件的管理并不能通过简单的文件拷贝,例如:cp .config arch/arm/configs/xxx_defconfig或者cp arch/arm/configs/xxx_defconfig .config都是错误的使用方式,因为编译脚本是使用 scripts/kconfig/下的一些工具对配置文件进行差异管理。
  • arch/xxx/configs/中保存的xxx_defconfig文件并不是一个完整的.config文件,而是去掉了一些通用配置的精简版配置。
  • 正确生成defconfig的方式是使用make savedefconfig命令。
xxx@chejiser:~/ssc323/ssc323bsp/kernel$ make savedefconfig
make[1]: Entering directory `/home/xxx/ssc323/ssc323bsp/kernel'
scripts/kconfig/conf  --savedefconfig=defconfig Kconfig  //通过scripts/kconfig/conf工具对当前配置进行处理
make[1]: Leaving directory `/home/xxx/ssc323/ssc323bsp/kernel'
xxx@chejiser:~/ssc323/ssc323bsp/kernel$ 
  • 最终生成的defconfig也是非常小的,仅仅只有2~3KB,而不像sigmastar提供的80KB左右。
  • scripts/kconfig/conf --savedefconfig=defconfig Kconfig 有使用到默认通用配置Kconfig, 打开可以发现:
xxx@chejiser:~/ssc323/ssc323bsp/kernel$ cat Kconfig
#
# For a description of the syntax of this configuration file,
# see Documentation/kbuild/kconfig-language.txt.
#
mainmenu "Linux/$ARCH $KERNELVERSION Kernel Configuration"

config SRCARCH
	string
	option env="SRCARCH"

source "arch/$SRCARCH/Kconfig" //关键代码,$SRCARCH是ARCH目标平台
  • 接着打开arch/arm/Kconfig,可以发现:
xxx@chejiser:~/ssc323/ssc323bsp/kernel$ cat arch/arm/Kconfig
...
source "net/Kconfig" //source 各个模块的Kconfig

source "drivers/Kconfig"

source "drivers/firmware/Kconfig"

source "fs/Kconfig"

source "arch/arm/Kconfig.debug"

source "security/Kconfig"

source "crypto/Kconfig"
if CRYPTO
source "arch/arm/crypto/Kconfig"
endif

source "lib/Kconfig"

source "arch/arm/kvm/Kconfig"
  • 官网说明
.config
All config symbol values are saved in a special file called  .config . Every time you want to change a kernel compile configuration, you execute a make target, such as  menuconfig  or  xconfig . These read the  Kconfig  files to create the menus and update the config symbols' values using the values defined in the  .config  file.   
Additionally, these tools update the  .config  file with the new options you chose and also can generate one if it didn't exist before.  
Because the  .config  file is plain text, you also can change it without needing any specialized tool.
It is very convenient for saving and restoring previous kernel compilation configurations as well.
* .config文件会保存所有的配置,是最终文件。 
 
deconfig
The  .config  file is not simply copied from your  defconfig  file. The motivation for storing  defconfig  in such a format is next: in  defconfig  we can only specify options with non-default values (i.e. options we changed for our board). This way we can keep it small and clear. 
Every new kernel version brings a bunch of new options, and this way we don't need to update our  defconfig  file each time the kernel releases. Also, 
it should be mentioned that kernel build system keeps very specific order of options in  defconfig  file, so it's better to avoid modifying it by hand. Instead you should use  make savedefconfig  rule.
When  .config  file is being generated, kernel build system goes through all  Kconfig  files (from all subdirs), checking all options in those  Kconfig  files:
if option is mentioned in  defconfig , build system puts that option into  .config  with value chosen in  defconfig
if option isn't mentioned in  defconfig , build system puts that option into  .config  using its default value, specified in corresponding  Kconfig
* 根据上述描述,xxx_deconfig中只保存那些没有默认值的option(但被用户修改过的option除外,如config_xxx默认值为y,但是被用户修改为n,那么config_xxx将被保存进deconfig)  ,因为有默认值的option保存在Kconfig中,没必要重复保存。

使用错误方式可能导致的问题

  1. defconf文件较大,数量一多,占用过多存储空间。
  2. 配置好的.config给到别人使用后,如果执行make menuconfig后会加入一些通用配置,导致配置发生变化,不是自己想要的配置,一些配置项甚至可能导致严重的问题。
  3. 默认的通用配置不一样,即使使用正确的方式最终生成的配置也不同。

总结

  • 使用别人的.config配置文件,选择1:不执行make menuconfig,直接make;选择2:如果需要进行配置,最好边对比边配置,确保未引入其他配置。

你可能感兴趣的:(#,Linux,内核知识)