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

举报
嵌入式与Linux那些事 发表于 2022/03/29 00:38:36 2022/03/29
【摘要】                    linux内核makefile文件分类 名称描述顶层makefile它是所有makefile文件的核心,从总体上控制着内核的编译、连接.config配置文件,在配置...

                   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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

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

  
 
  • 1
  • 2

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

顶层makefile的包含代码

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

ARCH      ?=arm

  
 
  • 1
  • 2
  • 3
  • 4

文章来源: blog.csdn.net,作者:嵌入式与Linux那些事,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_16933601/article/details/102886655

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。