###### 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