依据oplonu产品为例,着重解析编译过程
Kernel Version:linux2.6.21.5
SDK:https://github.com/DavionKnight/oplonu
if make f23pv1e
thenif make
then
if make install
接下来要进行的就是install过程
该过程oplonu/Makefile.rules,由于该部分代码比较集中,全部贴出如下:
1.重建根文件系统,并将opconn.img复制到root/bin/下
2.编译内核,但是不太明白为什么要判断if [ ! -f $(KERNEL_DIR)/linux-2.6.21.5/scripts/mod/modpost ];
难道只是为了判断内核是否编译过?(在这个地方并没有编译内核)
3.安装busybox,编译各模块,并复制到/root/modules/下
4.删除不用内容,执行mklzma.sh脚本
这个地方才是真正开始编译内核
make -j1 CROSS_COMPILE="mips-linux-uclibc-" ARCH="mips" CONFIG_SHELL="/bin/bash" CC="mips-linux-uclibc-gcc" V=1
-j1上层make 程序为其他make进程传递参数(详见gnu makefile手册)
LX = ../vmlinux
mips_4KC-objcopy --gap-fill=0xff -O binary $(LX) piggy
lzma e piggy piggy.lzma
以上将vmlinux (--gap-fill=0xff )用0xff来填充section之间的空隙。
生成piggy并压缩
uImageLzma: piggy.lzma
@echo $(VERSION)
@echo "make uImage using file $(LX) ... "
@echo $(BUILD_TIME)
@echo "svn=" $(SVN_VERSION)
@echo "cpuid=" $(SOCID)
./mkimage-new -i $(SOCID) -r $(SVN_VERSION) -A mips -O linux -T kernel -C lzma -a 80041000 -e \
0x$(shell grep kernel_entry $(LX_MAP) | awk '{ printf "%s", $$1 }') \
-n 'MIPS Linux-$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)' \
-d piggy.lzma $@
这一部分通过piiggy.lzma通过添加类型/版本/内存首地址,从system.map中查找start_kernel的首地址
-a address 80041000当boot load内核到内存时的地址
生成最后的uImage uImageLzma