2.3 內核啓動流程分析-Makefile 筆記

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章