2.2 分析内核启动——分析Makefile

本文解析了Linux内核的构建过程,从子目录Makefile到顶层Makefile,详细介绍了vmlinux的生成及其依赖关系,包括核心组件、驱动程序等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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顺藤摸瓜下去

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值