linux内核编译过程分析.doc
文本预览下载声明
从makefile开始分析内核编译过程:
我们在编译内核的时候,会使用make命令,那么这个make命令究竟做了什么工作呢?
顶层vmlinux生成过程
1. Make命令首先会从顶层的makefile中开始执行,按照默认规则,在makefile中的第一条规则就是其默认规则,
我们首先看到,vmlinux依赖于后面的几项,那么后面的变量又是定义成什么了呢?
以x86为例,到arch/x86/kernel/下去找vmlinux.lds.确实是存在的。现在就要去看 $(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 pattern;,replacement;,text;)
名称:模式字符串替换函数——patsubst。
功能:查找text;中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式 pattern;,如果匹配的话,则以replacement;替换。这里,pattern;可以包括通配符 “%”,表示任意长度的字串。如果replacement;中也包含“%”,那么,replacement;中的这个 “%”将是pattern;中的那个“%”所代表的字串。(可以用“\”来转义,以“\%”来表示真实含义的“%”字符)
返回:函数返回被替换过后的字符串。
示例:
$(patsubst?%.c,%.o,x.c.c bar.c)
把字串“x.c.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.o bar.o”
备注:
这和我们前面“变量章节”说过的相关知识有点相似。如:
“$(var:pattern;=replacement;)” 相当于 “$(patsubst pattern;,replacement;,$(var))”,
而“$(var: suffix;=replacement;)” 则相当于 “$(patsubst?%suffix;,%replacement;,$(var))”。
例如有:objects = foo.o bar.o baz.o,那么,“$(objects:.o=.c)”和“$(patsubst?%.o,%.c,$(objects))”是一样的。
********************************************************************
我们再来看最后一个core-y
从上图中可以看出core-y中既包含体系结构相关的,又包含体系结构无关的。
2.在1中是相关变量的定义,我们仔细剖析了其过程,但是请大家注意,定义有了,但是没有相关的动作,所以下一步我们就要继续分析其动作看看这些东西是如何生成的
在这里定义了他们依赖的文件,并且采用了makefile的一个排序函数sort,即将$(vmlinux-init) $(vmlinux-main)中的字符串按照升序排序,并且会去掉他们中相同的字符串。这三个target都依赖于vmlinux-dirs,好,我们再继续看一下vmlinux-dirs
那么vmlinux-dirs中又是什么内容呢?
注意里面有两个函数,首先filter函数
/************** Makefile filter 函数 ************************
$(filter pattern...;,text;)
名称:过滤函数——filter。
功能:以pattern;模式过滤text;字符串中的单词,保留符合模式pattern;的单词。可以有多个模式。
返回:返回符合模式pattern;的字串。
示例:
sources?:= foo.c bar.c baz.s ugh.h
foo: $(sources)
cc $(filter?%.c?%
显示全部