根据arch/unicore/kernel下的连接脚本vmlinux.lds以及hend.S等其他文件生成根目录下的vmlinuxELF格式文件。
quiet_cmd_vmlinux__ ?= LD $@
cmd_vmlinux__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) -o $@ \
-T $(vmlinux-lds) $(vmlinux-init) \
--start-group $(vmlinux-main) --end-group \
$(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o FORCE ,$^)
Image以根目录下的vmlinux通过objcopy生成binary格式。
cmd_arch/unicore/boot/Image := unicore32-linux-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S vmlinux arch/unicore/boot/Image
运用压缩工具gzip将Image进行压缩,生成piggy.gz
cmd_arch/unicore/boot/compressed/piggy.gz := (cat arch/unicore/boot/compressed/../Image | gzip -f -9 > arch/un icore/boot/compressed/piggy.gz) || (rm -f arch/unicore/boot/compressed/piggy.gz ; false)
在compressed目录下有个piggy.S,其中使用了.incbin 将piggy.gz”植入”piggy.S中,而后生成piggy.o
./boot/compressed/Makefile:56:$(obj)/piggy.o: $(obj)/piggy.gz FORCE
下面两个通过压缩而成的Image和compressed下的head.S(不同于kernel下的head.S)及piggy.o,misc.c生成含有部分被压缩的代码vmlinux(此vmlinux位于compressed目录下,不同于更目录下的vmlinux),运用的连接脚本是compressed目录下的vmlinux.lds(不同于kernel目录下的vmlinux.lds)
$(obj)/compressed/vmlinux: $(obj)/Image FORCE
$(Q)$(MAKE) $(build)=$(obj)/compressed $@
$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o \
$(addprefix $(obj)/, $(OBJS)) FORCE
$(call if_changed,ld)
@:
zImage有compressed下的vmlinux使用objcopy生成
cmd_arch/unicore/boot/zImage :=unicore32-linux-objcopy O binary -R .note –R .note.gnu.build-id –R .comment –S arch/unicore/boot/compressed/vmlinux arch/unicore/boot/zImage
uImage通过compressed下的zImage运用 mkimage工具生成。
cmd_arch/unicore/boot/uImage := /bin/bash /home/liuchangcheng/contest_android/kernel/scripts/mkuboot.sh -A unicore -O linux -T kernel -C none -a 0x40808000 -e 0x40808000 -n 'Linux-2.6.32.9' -d arch/unicore/boot/zImage ar ch/unicore/boot/uImage
mkimage的源程序大致看了一下(从tool下的mkimage.c文件开始阅读,而后是头文件中的数据结构,主要是里面有几个数据结构,自己的抽象能力还是不足,struct stat、truct image_type_params、struct mkimage_params还有个头结构,过段时间再看看),我们可以使用hexdump工具看看zImage 与uImage的区别,uImage在zImage前加了64个字节作为头信息)。