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

2021-05-20 15:04:43 浏览数 (1)

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。

systemlinux-2.6.22.6linux-2.6.22.6driverschar目录下的makefile

代码语言:javascript复制
/*-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两个文件

代码语言:javascript复制
/*顶层makefile已经包含了*/
-include include/config/auto.conf

systemlinux-2.6.22.6linux-2.6.22.6 目录下的makefile

代码语言:javascript复制
/*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)
/*archarmmakefile中定义了head-y*/
head-y		:= arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o
/*linux-2.6.22.6makefile*/
/*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.6makefile*/
/*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的包含代码

代码语言:javascript复制
/*包含到顶层目录*/
include $(srctree)/arch/$(ARCH)/Makefile

ARCH      ?=arm

0 人点赞