2013年12月12日星期四

FreeBSD make buildkernel




Make buildkernel 流程概览


图表 1 : make buildkernel流程

一、     编译内核

1.修改 /usr/src/sys/i386/conf/GENERIC 配置内核
2.编译内核
cd /usr/src
make buildkernel  或者 make buildkernel KERNCONF=MY_GENERIC
用下面的make参数将make信息顺便记录到/root/buildkernel.log
make buildkernel | tee /root/buildkernel.log

二、     Makefile 流程

编译内核的起始Makefile 是从 /usr/src目录下的Makefile文件开始的.
/usr/src/Makefile 中首先将buildkerenl 参数(target) 传递给${TGTS}

图表 2 : /usr/src/Makefile
然后在219行使用变量 ${_MAKE}继续执行

图表 3 : /usr/src/Makefile
看一下${_MAKE}的定义,${_MAKE}指定去make 当前目录下的 Makefile.inc1


图表 4 : /usr/src/Makefile
接下来在/usr/src/Makefile.inc1里可以看到整个内核编译的流程了, stage 1-3.

图表 5 : /usr/src/Makefile.inc1
首先mkdir了一个目录
mkdir -p /usr/obj/usr/src/sys

然后 stage 1 调用config 命令解析GENERIC生成接下来编译要用的Makefile和一些c文件.
cd /usr/src/sys/i386/conf
config  -d /usr/obj/usr/src/sys/GENERIC  /usr/src/sys/i386/conf/GENERIC

config 的源码在 /usr/src/usr.sbin/config 目录下.
Makefile是由makefile()函数生成的.


图表 6 : /usr/src/usr.sbin/config/main.c
i386平台下,makefile()函数读取/usr/src/sys/conf目录下的filesfiles.i386并根据文件里的规则生成相应的Makefile.
最终的Makefile /usr/obj/usr/src/sys/GENERIC/Makefile,后面所有buildkernel都由这个Makefile 开始.

Stage 2 :如下图

图表 7 : /usr/src/Makefile.inc1
Stage 2会用config 生成的Makefile make相关的目标.
这里看下 stage2.1 ${KMAKE } {CLEANDIR} 的流程
命令如下:
make  -m /usr/src/share/mk TARGET=i386 TARGET_ARCH=i386  KERNEL=kernel cleandir
${KRNLOBJDIR}/${_kernel} 对应/usr/obj/usr/src/sys/GENERIC
即上一步 config 生成的Makefile
Makefile末尾包含了 /usr/src/sys/conf/kern.post.mk.


图表 8 : /usr/obj/usr/src/sys/GENERIC/Makefile
kern.post.mk, cleandir 参数(target)会被依赖于 kernel-cleandir

图表 9 : /usr/src/sys/conf/kern.post.mk
kernel-cleandir的规则

图表 10 : /usr/src/sys/conf/kern.post.mk
kernel-clean

图表 11 : /usr/src/sys/conf/kern.post.mk
Stage 3

图表 12 : /usr/src/Makefile.inc1
Stage 3基本流程和 Stage 2差不多,都是 Make –f /usr/obj/usr/src/sys/GENERIC/Makefile.


没有评论:

发表评论