内核编译分析
确保在源码根目录下存在.config文件存在,若没有可从其他地方复制一个。然后执行make menuconfig命令配置内核编译选项。最后执行make命令进行编译。
本节主要分析内核编译的Makefile,了解zImage生成过程。分析Makefile文件之前需对Makefile文件格式有一定了解,否则阅读内核Makefile文件会比较吃力。
本文使用的内核版本为2.6.32.2。
首先打开源码根目录下的Makefile文件,此文件称为顶层Makefile文件。
在./Makefile中Line 100~101:
PHONY := _all
_all:
这是我们在命令行下执行make后Makefile默认的目标_all。
再看Line135~140
PHONY += all
ifeq ($(KBUILD_EXTMOD),)
_all: all
else
_all: modules
endif
我们不编译额外的扩展模块,所以KBUILD_EXTMOD为空,即定义目标_all,而该目标依赖于all。因之前存在一个相同目标_all为空,所以合并后还是_all: all。
接着看Line446
include $(srctree)/arch/$(SRCARCH)/Makefile
变量srctree和SRCARCH均在本文件中有定义,展开后为
include ./arch/arm/Makefile
我们打开这个文件
在./arch/arm/Makefile中Line238
all: $(KBUILD_IMAGE)
在这里找到了all。变量KBUILD_IMAGE定义在Line232~235
ifeq ($(CONFIG_XIP_KERNEL),y)
KBUILD_IMAGE := xipImage
else
KBUILD_IMAGE := zImage
Endif
展开后all: zImage。继续往下看Line255~256
zImage Image xipImage bootpImage uImage: vmlinux
$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
这里可看到zImage依赖vmlinux。变量Q定义在./Makefile中Line280~285
ifeq ($(KBUILD_VERBOSE),1)
quiet =
Q =
else
quiet=quiet_
Q = @
Endif
系统变量MAKE即对应make。变量boot定义在line240
boot := arch/arm/boot
变量MACHINE定义在Line197~201
ifneq ($(machine-y),)
MACHINE := arch/arm/mach-$(word 1,$(machine-y))/
else
MACHINE :=
Endif
变量machine-y的值为s3c2410 s3c2400 s3c2412 s3c2440 s3c2442 s3c2443
这几个变量此处不再展开。变量build定义在./scripts/Kbuild.include中
build := -f $(if $(KBU