Linux 内核中的 kconfig 原理

linux中的 make menuconfig 出来的图形界面来配置内核,这种方法很是方便,今天我们就来分析下内核源码中是怎么实现它的。

关于本项目的链接:http://git.oschina.net/qqliyunpeng/menuconfig

1. 第一步:配置生成 .conf

当我们执行 make menuconfig 的时候,调用的是 scripts/kconfig/Makefile 文件中对 menuconfig 的定义:

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

展开其中的符号和一些变量:

menuconfig: scripts/kconfig/mconf
    scripts/kconfig/mconf -s Kconfig

逻辑是这样的:

  1. menuconfig
  2. 检查 scripts/kconfig/mconf 文件存不存在
  3. 如果不存在,用Makefile中的依赖关系,生成 mconf 文件
  4. 如果存在,执行 mconf Kconfig

执行的结果是输出图形界面。配置完成后,在linux的家目录下回生成 .conf 这个文件,注意,这个文件是隐藏文件。

其中的内容是这样的:

CONFIG_ARM=Y
CONFIG_MIGHT_HAVE_PCI=Y
...

明显的,这些个配置是不能使用的,内核在使用的时候其实是使用的根据配置文件生成的 autoconf.h 文件

2. autoconf.h文件的生成

这个文件位于 include/config/generated/
文件的生成是最顶层的 Makefile 中的这一句:

$(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig

展开:

@/bin/make -f scripts/kconfig/Makefile silentoldconfig

解释:
进入 scripts/kconfig/Makefile 目录下执行 make silentoldconfig

此命令执行的是这样的一句话:

conf --silentoldconfig Kconfig

他会检查,配置选项中是不是有 (new) 项,如果没有,便会在 include/ 目录下两个文件 conf、generated。如果有,可能会编译错误,因此,这里一定要注意配置中不能有新的配置项。

include/
├── config
│ ├── auto.conf
│ ├── auto.conf.cmd
│ ├── gen
│ │ └── choice1.h
│ ├── ledon.h
│ ├── num
│ │ ├── param2.h
│ │ └── param.h
│ ├── string
│ │ └── param.h
│ ├── tristate
│ │ └── param.h
│ └── tristate.conf
└── generated
└── autoconf.h

其中的 generated/autoconf.h 便是我们用图形界面配置的宏了,在普通工程中使用,只需要在文件的头部inlcude进 autoconf.h 即可。

你可能感兴趣的:(linux)