00_内核Kernel的Makefile分析

本文详细解析了 Linux 2.6.22.6 版本内核的编译过程,包括 makefile 的分析及编译命令的解释。介绍了 vmlinux 的构成及其各个部分的含义,并通过具体命令演示了编译流程。

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


###### linux-2.6.22.6 分析######

编译内核命令:
make  或 make uImage 

#搜uImage

(在arch/arm/Makefile中)
zImage Image xipImage bootpImage uImage: vmlinux

#################################################################

(在顶层Makefile中)
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
#-lds 链接文件,-init 初始化的代码,-main 主要的代码,即和内核很相关的代码

ifdef CONFIG_HEADERS_CHECK
    $(Q)$(MAKE) -f $(srctree)/Makefile headers_check
endif
    $(call if_changed_rule,vmlinux__)
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
    $(Q)rm -f .old_version
#上述代码描述vmlinux怎么被编译的,这些命令最终会生成什么东西,这些脚本实在是太庞大了,不太容易分析!!!
#有一个简单的方法,下面的原材料如何编译成内核的:一个方法是分析makefile(如上);第二个方法是直接编译内核,如下
rm vmlinux
make uImage V=1     #V=1是把命令更加详细的列出来
#关心打印出的最后面的命令即可。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
vmlinux-init := $(head-y) $(init-y)

head-y        := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o       #(在arch/arm/Makefile中)
注意:MMUEXT如果没定义的话,就不用它,最后变成head.o
MMUEXT        := -nommu              # MMUEXT没有被定义                            #(在arch/arm/Makefile中)

init-y        := init/               #(在顶层Makefile中)
init-y        := $(patsubst %/, %/built-in.o, $(init-y))   #  即相当于  := init/build-in.o
init-y等于init目录下所有涉及的那些文件,那些文件会被编译成一个build-in.o

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
#                              核心         库           驱动          网络

core-y        := usr/                                                              #(在顶层Makefile中)
core-y        += kernel/ mm/ fs/ ipc/ security/ crypto/ block/                     #(在顶层Makefile中)
core-y        := $(patsubst %/, %/built-in.o, $(core-y))                           #(在顶层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

libs-y        := lib/
#etc
#即libs-y最终相当于 lib/lib.a lib/build-in.o

drivers-y    := drivers/ sound/
#etc
#即drivers-y最终相当于 drivers/build-in.o  sound/build-in.o
#即dirvers下所有涉及的文件都被编译成build-in.o,sould下所有涉及的文件都被编译成build-in.o

net-y        := net/
#etc
#即net-y最终相当于 net/build-in.o

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


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

等等

#########################################################################

分析makefile可得下面的信息,重要!!!!!!!!!
1. 第一个文件:arch/arm/kernel/head.o
2. 链接脚本:arch/arm/kernel/vmlinux.lds

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值