###### linux-2.6.22.6 分析######
編譯內核命令:
make 或 make uImage
#搜uImage
(在arch/arm/Makefile中)
zImage Image xipImage bootpImage uImage: vmlinux
#################################################################
(在頂層Makefile中)
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
#-lds 鏈接文件,-init 初始化的代碼,-main 主要的代碼,即和內核很相關的代碼
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怎麼被編譯的,這些命令最終會生成什麼東西,這些腳本實在是太龐大了,不太容易分析!!!
#有一個簡單的方法,下面的原材料如何編譯成內核的:一個方法是分析makefile(如上);第二個方法是直接編譯內核,如下
rm vmlinux
make uImage V=1 #V=1是把命令更加詳細的列出來
#關心打印出的最後面的命令即可。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
vmlinux-init := $(head-y) $(init-y)
head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o #(在arch/arm/Makefile中)
注意:MMUEXT如果沒定義的話,就不用它,最後變成head.o
MMUEXT := -nommu # MMUEXT沒有被定義 #(在arch/arm/Makefile中)
init-y := init/ #(在頂層Makefile中)
init-y := $(patsubst %/, %/built-in.o, $(init-y)) # 即相當於 := init/build-in.o
init-y等於init目錄下所有涉及的那些文件,那些文件會被編譯成一個build-in.o
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
# 核心 庫 驅動 網絡
core-y := usr/ #(在頂層Makefile中)
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ #(在頂層Makefile中)
core-y := $(patsubst %/, %/built-in.o, $(core-y)) #(在頂層Makefile中)
#即core-y最終相當於 usr/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
libs-y := lib/
#etc
#即libs-y最終相當於 lib/lib.a lib/build-in.o
drivers-y := drivers/ sound/
#etc
#即drivers-y最終相當於 drivers/build-in.o sound/build-in.o
#即dirvers下所有涉及的文件都被編譯成build-in.o,sould下所有涉及的文件都被編譯成build-in.o
net-y := net/
#etc
#即net-y最終相當於 net/build-in.o
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
vmlinux-all := $(vmlinux-init) $(vmlinux-main)
vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds
等等
#########################################################################
分析makefile可得下面的信息,重要!!!!!!!!!
1. 第一個文件:arch/arm/kernel/head.o
2. 鏈接腳本:arch/arm/kernel/vmlinux.lds