05.内核启动流程分析之makefile

                   linux内核makefile文件分类

名称描述
顶层makefile它是所有makefile文件的核心,从总体上控制着内核的编译、连接
.config配置文件,在配置内核时生成。所有makefile文件(包括顶层目录及各级子目录)都是根据.config来决定使用那些文件
arch/$(ARCH)/Makefile对于体系结构的makefile,它用来决定那些体系结构相关的文件参与内核的生成,并提供一些规则来生成特定格式的内核映像
scripts/Makefile.*Makefile共用的通用规则、脚本等
kbuild Makefiles各级子目录下的Makefile,它们相对简单,被上一层Makefile调用来编译当前目录下的文件

  分析makefile从顶层开始,顺藤摸瓜的分析下去,会涉及到所有的makefile文件。各级子目下的makefile完成的动作obj -y += obj -m +=
  make uImage时,uImage在arch/arm/makefile中,顶层makefile中一定包含了底层的makefile。

system\linux-2.6.22.6\linux-2.6.22.6\drivers\char目录下的makefile

/*-y表示后面的内容会被编译进内核*/
obj-y	 += mem.o random.o tty_io.o n_tty.o tty_ioctl.o
/*-m表示后面的内容会被编译成模块*/
obj-m	 += s3c24xx_leds.o
/*a.c,b.c编译成一个模块,ab.ko*/
obj -m += ab.o
ab -objs :=a.o b.o

.config会生成auto config.h和auto.conf两个文件

/*顶层makefile已经包含了*/
-include include/config/auto.conf

system\linux-2.6.22.6\linux-2.6.22.6 目录下的makefile

/*uIamge其实时一个头部。真正的linux在后面vmlinux*/
zImage Image xipImage bootpImage uImage: vmlinux
	$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
/*vmlinux的依赖*/
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
/*各部分如下*/
vmlinux-init := $(head-y) $(init-y)
/*arch\arm\makefile中定义了head-y*/
head-y		:= arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o
/*linux-2.6.22.6\makefile*/
/*init目录下所有涉及的文件会编译成built-in.o*/
init-y		:= init/
init-y		:= $(patsubst %/, %/built-in.o, $(init-y))


vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
/*linux-2.6.22.6\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*/
core-y		:= usr/
core-y		+= kernel/ mm/ fs/ ipc/ security/ crypto/ block/
core-y		:= $(patsubst %/, %/built-in.o, $(core-y))
/*所有目录涉及的文件都会编译成built-in.o libs-y= lib/lib.a lib/built-in.o*/
libs-y		:= lib/
libs-y		:= $(libs-y1) $(libs-y2)
libs-y1		:= $(patsubst %/, %/lib.a, $(libs-y))
libs-y2		:= $(patsubst %/, %/built-in.o, $(libs-y))
/*所有目录涉及的文件都会编译成built-in.o drivers-y	:= drivers/built-in.o sound/built-in.o*/
drivers-y	:= drivers/ sound/
/*所有目录涉及的文件都会编译成built-in.o  net-y		:= net/built-in.o*/
net-y		:= net/

vmlinux-all  := $(vmlinux-init) $(vmlinux-main)
vmlinux-lds  := arch/$(ARCH)/kernel/vmlinux.lds

/*以上这些原材料如何编译进内核?直接编译内核可以看出来*/
/*第一个文件:arch/arm/kernel/head.o*/
/*链接脚本:arch/arm/kernel/vmlinux.lds*/
arm-linux-ld-EL -p--no-undefined-X-o vmlinux
/*lds决定原材料的排布*/
-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

顶层makefile的包含代码

/*包含到顶层目录*/
include $(srctree)/arch/$(ARCH)/Makefile

ARCH      ?=arm
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式与Linux那些事

您的鼓励将使我写出更好的文章

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值