当我们分析内核的时候,第一件事就是找出内核运行的入口点在哪里,也就是第一个文件。所以我们需要对内核的顶层目录Makefile进行分析。
这里可以看到vmlinux依赖于vmlinux-lds、vmlinux-init、vmlinux-main
至于这些文件是怎么编译链接进去的,我们无需废精力去分析 $(srctree)/scripts/Makefile.modpost 这个脚本文件,只需要在顶层目录下,配置好linux后,执行命令make uImage V=1( V=1 表示编译过程会被详细列出来),然后在列出来的条目中可以找到下面这句话:
一般我们编译内核的时候,需要把内核镜像文件uImage编译出来,然后烧进开发板上,所以在顶层Makefile中搜索uImage,可以找到这么一句话
zImage Image xipImage bootpImage uImage: vmlinux
$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
也就是说uImage依赖于vmlinux。继续搜索:
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
$(call if_changed_rule,vmlinux__)
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
$(Q)rm -f .old_version
这里可以看到vmlinux依赖于vmlinux-lds、vmlinux-init、vmlinux-main
搜索顶层Makefile和子目录Makefile,并将函数拆解开:
vmlinux-init := $(head-y) $(init-y)
head-y := arch/arm/kernel/head-nommu.o arch/arm/kernel/init_task.o
init-y := init/built-in.o
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
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/lib.a lib/built-in.o
drivers-y := drivers/built-in.o sound/built-in.o
net-y :=net/build-in.o
vmlinux-lds := arch/arm/kernel/vmlinux.lds
至于这些文件是怎么编译链接进去的,我们无需废精力去分析 $(srctree)/scripts/Makefile.modpost 这个脚本文件,只需要在顶层目录下,配置好linux后,执行命令make uImage V=1( V=1 表示编译过程会被详细列出来),然后在列出来的条目中可以找到下面这句话:
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
至此,我们知道linux的第一条代码在顶层目录arch/arm/kernel/head.s中。
以上即是linux顶层目录Makefile的分析过程。