Linux内核的Makefile如下:
1. 为了更好的分析,我们从最底层Makefile(子目录Makefile)看起
如: drivers/char/Makefile
obj-$(CONFIG_MVME147_SCC) += generic_serial.o vme_scc.o
假设我们有a.c b.c两个文件,要怎么组成一个模块
这个在Documentation/kbuild/makefiles.txt(这个文件是对子目录Makefile的一些说明,有时间看看很有意义)
意思是
2.往上的Makefile通用规则这里不分析,有时间自己看看
3.分析体系结构的Makefile——arch/arm/Makefile
我们回忆我们之前是生成了uImage,于是我们想到从顶层往下分析
arch/arm/Makefile搜索uImage
我们猜测,arch/arm/Makefile可能是被include在顶层目录
这里的$(ARCH)是arm,所以arch/arm/Makefile被包含进了顶层Makefile
同理,可以发现之前.config生成的include/config/auto.conf和include/linux/autoconf.h也被包含进去
4.现在重点分析顶层Makefile
我们在arch/arm/Makefile知道uImage是依赖于vmlinux, 所谓uImage是64字节+真正的头部
而真正的内核就是vmlinux
我们在顶层Makefile查看ALL,发现all:vmlinux。显然我们执行make后,都是先生成vmlinux
我们找找vmlinux依赖谁
zImage Image xipImage bootpImage uImage: vmlinux
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
分析依赖项
(1)vmlinux-init := $(head-y) $(init-y)
head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o(在arm下)
init-y :=init/
init-y := $(patsubst %/, %/built-in.o, $(init-y)) (顶层Makefile找到)(%/表示init/)
=init/built-in.o
(2)vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
core-y := usr/
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
core-y := $(patsubst %/, %/built-in.o, $(core-y))
最后 =usr/built-in.o kernel/built-in.o fs/built-in.o ipc/ built-in.o security/built- in.o crypto/built-in.o block/built-in.o
vmlinux-all := $(vmlinux-init) $(vmlinux-main)
vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds
从这里我们可以知道,它的原材料就是上面这堆东西,那么这些东西怎么链接在一块的,如果又去分析顶层Makefile有点困难,我们用更巧妙的方法,直接在/linux-2.6.22.6#执行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 (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确认了
我们打开vmlinux.lds所在目录,发现只有vmlinux.lds.S,显然vmlinux.lds是根据vmlinux.lds.S生成的
但我们不关心vmlinux.lds.S,我们看我们编译生成的vmlinux.lds
这里的所有text已经下面东西的排放顺序就是我们在上面分析的这个顺序
分析到这里,我们就大概知道了内核的架构是怎么的了
于是,我们分析Makefile得到了
以后我们分析内核流程,就分析第一个文件head.S顺藤摸瓜下去