内核配置和编译
前言
.config、 Kconfig 、Makefile 之间的关系
一、Makefile
1、Linux内核源码的每个目录下都有一个Makefile,由该 Makefile 对源代码的编译、链接等操作进行控制。
2、编译完成后,每个源代码目录下都会生成一个名叫 built-in.o的文件。这个文件由每个源代码目录下的所有源文件编译后的目标文件链接而成;而不同的built-in.o 又被上层目录中的Makefile链接成更大的builtin. o,直到最后链接成为一个内核vmlinux.o。
3、在linux根目录下 make 或 make uImage 后生成最终的文件Iamge(uImage)放在/arch/arm/boot下 、uImage就可烧录到开发板
二、 Kconfig
在进行make menuconfig时,可视界面的生成依赖于Kconfig文件。一般来说,每个源代码目录下都有一个Kconfig文件。在Kconfig下的东西才能在menu内显示。
Kconfig文件的基本要素主要包括:
1、config条目(entry)
2、 menu条目
3、choice条目
4、Source
1、config条目:
config条目常被其它条目包含,用来生成菜单、进行多项选择等,它是kconfig的最小单位,用于生成一个变量。
它控制着make menucofig时,出现的配置选项,并根据用户在配置界面中的选择,把内核配置所做的修改最终反应在.config文件中(即会生成配置文件.config)。
例子(把这个config条目放置在/drivers/char/Kconfig文件里,看看效果?)
config MODULE_HELLO #配置项
tristate “module hello“ #类型和提示
depends on xx #依赖
default y #默认值
select CRC32 #反向依赖
select MII
---help--- #帮助提示
Support for module hello.
To compile this driver as a module, choose M here.
The module will be called hello.
配置项:
类型:bool(2钟选择y、n)、tristate(3种、y、m、n)、int、hex、string
输入提示:在menu出现的名称
数值范围:只用于int和hex两种类型 可进行配置赋值
默认值:用户没有设置过,配置选项就是使用默认值
依赖:依赖其他config条目 其他满足此条目才可显示
反向依赖:此条目满足,反向依赖也满足
帮助:帮助的提示信息
在make menuconfig下可以看到 “module hello”
按空格可进行3个转态的切换 【 * 、m、“ ” 】
2、menu条目
menu “MODULE (test)"
……
endmenu
menu和endmenu是关键字,中间可配置若干config条目或choice条目或source。
它最后在配置菜单的体现形式为:
MODULE (test) --->
例子:
menu “MODULE (test)” #菜单项
config MODULE_HELLO #配置项
tristate “module hello“ #类型和提示
depends on ARM || BLACKFIN || MIPS #依赖
default y #默认值 def_tristate y
…
config MODULE_GOODBYE #配置项
bool “module goodbye“ #类型和提示
depends on ARM || BLACKFIN || MIPS #依赖
default y #默认值 def_tristate y
endmenu #菜单项 结束
3、choice条目
choice #单选项
prompt “module(test)"
……
endchoice
choice和endchoice是关键字,中间可配置若干config条目。
它最后在配置菜单的体现形式为:进入只可选其一
module(test) --->
例:
choice #单选项
prompt “module (test)"
default MODULE_HELLO
config MODULE_HELLO #配置项
tristate “module hello“ #类型和提示
depends on ARM || BLACKFIN || MIPS #依赖
default y #默认值 def_tristate y
…
config MODULE_GOODBYE #配置项
bool “module goodbye“ #类型和提示
depends on ARM || BLACKFIN || MIPS #依赖
default y #默认值 def_tristate y
endchoice #单选项 结束
不选择的话默认是MODULE_HELLO项
4、source条目
source "drivers/net/fec_8xx/Kconfig"
用于引入另一个Kconfig文件 类似于include
三、.config
1、.config文件是linux编译时所依赖的文件。我们在配置内核时所做的任何修改,最终都会在这个文件中体现出来。它是Makefile对内核进行处理的重要依据。
2、一般来说,内核提供了芯片公司demo板的.config文件,我们一般找一个近似的进行修改。如S3C2410平台上,可以选择目录arch/arm/configs下的s3c2410_defconfig这个文件。
3、make menuconfig 后即可生成 .config
四、之间联系
1、Kconfig对.config文件的影响:
…
CONFIG_MODULE_HELLO=y
…
make menuconfig对内核配置所做的修改最终反应在
.config文件中。如上所示,在.config文件中
CONFIG_MODULE_HELLO=y被定义为y。
2、Kconfig对Makefile文件的影响:
…
obj-$(CONFIG_MODULE_HELLO) += hello.o
…
CONFIG_MODULE_HELLO是tristate类型,有三个可能取值:
y:编译进内核
m:编译成模块 make module 生成
n:不进行编译
若是bool类型,则只有两种可能,y或者n。
当CONFIG_MODULE_HELLO为y是hello.c 才可以编译成hello.o文件,进而编进内核 为 m时 make module 生成模块
3、编译
make clean:仅仅是清除上次的make命令所产生的object文件(后缀为“.o”
的文件)及可执行文件 。但是会保留内核的配置文件.config。
make mrproper:删除所有的编译生成文件, 还有内核配置文件,
再加上各种备份文件。
make distclean: 删除mrproper删除的文件,
加上编辑备份文件和一些补丁文件。
make zImage:生成内核压缩映像文件zImage(放置在arch/arm/boot下)
make Image:生成内核映像文件zImage(放置在arch/arm/boot下)
make uImage:生成uboot专用的映像文件,它是在zImage之前加上一个长度为64
字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息;其0x40之
后与zImage没区别。 (放置在arch/arm/boot下)
4、如何获得.config文件
前面提到,.config是内核编译时所依赖的重要文件,与具体的硬件构架和开发板类型相关。我们选择内核提供的s3c2410_defconfig进行修改。
cp arch/arm/configs/s3c2410_defconfig .config
在arch/arm/configs下有一些不同硬件开发板的.config可以使用 在需要时copy到根目下 的.config
。