下面以DM9000的配置为例:
在一个编译好的内核代码里,寻找CONFIG_DM9000所在位置: s3c2410_defconfig, c代码, 头文件, auto.conf, 相应子目录的makefile.
arch/arm/plat-s3c24xx/common-smdk.c:250:#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
arch/arm/configs/s3c2410_defconfig:588:CONFIG_DM9000=y
drivers/net/Makefile:197:obj-$(CONFIG_DM9000) += dm9dev9000c.o
drivers/net/Makefile:198:#obj-$(CONFIG_DM9000) += dm9000.o
drivers/net/Makefile:199:#obj-$(CONFIG_DM9000) += dm9ks.o
include/config/auto.conf:144:CONFIG_DM9000=y
include/linux/autoconf.h:145:#define CONFIG_DM9000 1
相关配置编译过程:
1. make menuconfig选配生成.config
2. make uImage的过程中, 根据.config生成中间文件include/linux/autoconf.h以及config/auto.conf.
include/linux/autoconf.h是给arch/arm/plat-s3c24xx/common-smdk.c引用的;
config/auto.conf是给顶层以及子目录的drivers/net/Makefile引用的,makefile里面根据config/auto.conf决定是否编译,和编译的方式(编译进内核/编译成模块).
——————————————————————————
关于menuconfig:
1). menuconfig的菜单选项是如何得来的呢?
2).如何在menuconfig中选配的驱动或者功能模块呢?
以UNIX98_PTYS为例, 我们在Kconfig里面增加了CONFIG_UNIX98_PTYS的菜单描述.
在menuconfig菜单里面输入/进入搜索界面,输入UNIX98_PTYS,确定,可以看到UNIX98_PTYS的定义/位置/依赖关系等相关信息.
首先depend项必须选中, "for small systems",即EMBEDDED.
可以看到因为default y, 默认是选中编译到内核中的. 此外还有defaule m, 默认编译为模块. default n, 默认不编译.
3). 在menuconfig选配的驱动或者功能模块是如何被内核编译到的呢?
step1: make menuconfig时,引用各级Kconfig生成菜单选项,用户选定后,生成.config;
step2: 主Makefile以及各级Makefile 引用.config 里面的宏定义选项(同时还要引用各级写好的Kbuild),生成宏定义头文件( 如 /include/linux/autoconf.h :#define CONFIG_ARM 1 )并编译内核。
以UNIX98_PTYS为例, 看目录层次:
linux-2.6.22.6/ Makefile:KCONFIG_CONFIG ?= .config
linux-2.6.22.6/.config:CONFIG_UNIX98_PTYS=y 【或 =m , 或CONFIG_UNIX98_PTYS is not set】
linux-2.6.22.6/drivers/char/Makefile : obj-$(CONFIG_UNIX98_PTYS) += pty.o
linux-2.6.22.6/drivers/char/Kconfig:
config UNIX98_PTYS
bool "Unix98 PTY support" if EMBEDDED
default y
---help---
A pseudo terminal (PTY) is a software device consisting of two
halves: a master and a slave. The slave device ....
=================================================================================
Kbuid一般形式: obj-$(xx) += pty.o
还有部分Kbuid文件和Makefile格式相似.
Kbuild Makefile有特定的语法指定哪些编译进内核中、哪些编译为模块、及对应的源文件是什么等。Kbuild Makefile的文件名不一定是Makefile,尽管推荐使用Makefile这个名字。 大多的Kbuild文件的名字都是Makefile。为了与其他Makefile文件相区别,你也可以指定Kbuild Makefile的名字为Kbuild。
header-y += ipt_ttl.h
header-y += ipt_TTL.h
header-y += ipt_ULOG.h
Kconfig一般形式:
config VT_CONSOLE
bool "Support for console on virtual terminal" if EMBEDDED
depends on VT
default y
---help---
The system console is the device which receives all kernel messages
and warnings and which allows logins in single user mode. If you
answer Y here, a virtual terminal ...
.config的一般形式:(make自动生成的)
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
CONFIG_BLK_DEV_NBD=m
# CONFIG_BLK_DEV_UB is not set
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16