2.3 内核启动流程分析-Makefile 笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jrc_january/article/details/82421962

1. Makefile种类

名称 描述
顶层Makefile 它是所有Makefile文件的核心,从总体上控制着内核的编译、链接。
.config 配置文件,配置内核时生成。顶层以及各子目录Makefile都是根据.config来决定使用哪些文件。
arck/%(ARCK)/Makefile 对应体系结构的Makefile,它用来决定哪些体系结构相关的文件参与内核的生成,并提供一些规则来生产特定格式的内核映像。
scripts/Makefile.* Makefile公用的通用通用规则、脚本。
kbuild Makefiles 各级子目录的Makefile,它们相对简单,被上一层Makefile调用来编译当前目录下的文件。

Makefile文档:<kernel path>/Documentation/kbuild/makefiles.txt

2. 子目录Makefile

example:
obj-$(CONFIG_XXX) +=yyy.o
用来表示该选项编译进内核还是编译为模块。


如果多个文件编译为一个模块:
example:
obj-$(CONFIG_ISDN)+= isdn.o
isdn-objs:=isdn_net_lib.o isdn_v110.o isdn_common.o
CONFIG_ISDN=m则最终生成isdn.ko文件。

3. 架构相关的Makefile

例如ARM平台:
<kernel path>/arch/arm/Makefile

4. .config文件

我们知道.config文件在编译时会生成auto.conf,在顶层Makefile中:
我们发现-include includ/config/zuto.conf,即顶层Makefile中包含了auto.conf文件。

5. 顶层Makefile

我们编译内核时 使用make uImage命令。以此为线索,我们发现:


顶层Makefile:
include $(srctree)/arch/$(ARCH)/Makefile
其中:
ARCH ?=arm
include <kernel dir>/arch/arm/Makefile 即顶层目录包含了架构的Makefile。


我们打开架构Makefile:
uImage : vmlinux
因此我们才能在顶层目录执行make uImage生成uImage
uImage依赖于vmlinux


我们发现vmlinux的依赖:
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
ifdef CONFIG_HEADERS_CHECK
$(Q)$(MAKE) -f $(srctree)/Makefile headers_check
endif
$(call if_changed_rule,vmlinux__)
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
$(Q)rm -f .old_version


vmlinux依赖于:
vmlinux-lds
vmlinux-init
vmlinux-main
kallsyms.o
这些参数完全展开后就是vmlinux的依赖项。其中包括了第一个文件:arch/arm/kernel/head.S以及链接脚本:arch/arm/kernel/vmlinux.lds


vmlinux的编译规则,如果将其展开同样会很庞大,我们直接make uImage V=1查看构建过程,
在最后链接vmlinux时可以看到vmlinux是如何构成的:
arm-linux-ld -EL -p --no-undefined -X -o vmlinux
-T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o arch/arm/kernel/init_task.o init/built-in.o --start-group usr/built-in.o arch/arm/kernel/built-in.o arch/arm/mm/built-in.o arch/arm/common/built-in.o arch/arm/mach-s3c2410/built-in.o arch/arm/mach-s3c2400/built-in.o arch/arm/mach-s3c2412/built-in.o arch/arm/mach-s3c2440/built-in.o arch/arm/mach-s3c2442/built-in.o arch/arm/mach-s3c2443/built-in.o arch/arm/nwfpe/built-in.o arch/arm/plat-s3c24xx/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o drivers/built-in.o sound/built-in.o net/built-in.o --end-group .tmp_kallsyms2.o

小结:

这里最重要的是剖析了Makefile,目的是了解内核的编译过程。最重要的两个文件:第一个文件:arch/arm/kernel/head.S以及链接脚本:arch/arm/kernel/vmlinux.lds

猜你喜欢

转载自blog.csdn.net/jrc_january/article/details/82421962
2.3