2024年3月24日发(作者:)

从makefile开始分析内核编译过程:

我们在编译内核的时候,会使用make命令,那么这个make

命令究竟做了什么工作呢?

顶层vmlinux生成过程

1. Make命令首先会从顶层的makefile中开始执行,按照默认规则,

在makefile中的第一条规则就是其默认规则,

我们首先看到,vmlinux依赖于后面的几项,那么后面的变量又是定义成什么了呢?

以x86为例,到arch/x86/kernel/下去找.确实是存在的。现在就

要去看 $(vmlinux-init)和$(vmlinux-main)

这里又看到,$(vmlinux-init)和$(vmlinux-main)里面的内容是什么?在顶层

makefile中我们可以看到下面的语句:

经过变量代换,我们可以看到是arch/x86/makefile,我们首先分析head-y

其中BITS指的是机器的位数,通常我们分析的是32位机器。我们代换变量后可以看到head-y

由三个主要的文件组成,head_32.o(head_32.S)、head32.o(head32.c)、init_task.o,这是体

系结构相关的。

我们接着分析init-y

从结果可以看出这是一个体系结构无关的。

初始时init-y:=init/经过patsubst函数替换后,会变成init-y:=init/built-in.o。

/******************makefile patsubst函数************************

$(patsubst ;,;,;)

名称:模式字符串替换函数——patsubst。

功能:查找;中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是

否符合模式< pattern>;,如果匹配的话,则以;替换。这里,;

可以包括通配符 “%”,表示任意长度的字串。如果;中也包含“%”,

那么,;中的这个 “%”将是;中的那个“%”所代表的字串。

(可以用“”来转义,以“%”来表示真实含义的“%”字符)

返回:函数返回被替换过后的字符串。

示例:

$(patsubst %.c,%. bar.c)

把字串“x.c.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.o bar.o”

备注:

这和我们前面“变量章节”说过的相关知识有点相似。如:

“$(var:;=;)” 相当于 “$(patsubst

;,;,$(var))”,

而“$(var: ;=;)” 则相当于

“$(patsubst %;,%;,$(var))”。

例如有:objects = foo.o bar.o baz.o,那么,“$(objects:.o=.c)”和

“$(patsubst %.o,%.c,$(objects))”是一样的。