文档详情

linux内核编译过程分析.doc

发布:2017-06-15约4.6千字共9页下载文档
文本预览下载声明
从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?%
显示全部
相似文档