其實uboot啟動映像主要是在原來的zImage前加上一個他要0x40的tag,告訴uboot一些關於Linux內核啟動的信息。
在arch/arm/boot/Makefile 62行開始有命令和規則:
quiet_cmd_uimage = UIMAGE $@
cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel \
-C none -a $(ZRELADDR) -e $(ZRELADDR) \
-n 'Linux-$(KERNELRELEASE)' -d $
$(obj)/uImage: $(obj)/zImage FORCE
$(call if_changed,uimage)
@echo ' Image $@ is ready'
其實uboot啟動映像主要是在原來的zImage前加上一個他要0x40的tag,告訴uboot一些關於內核啟動的信息。這個規則的命令就是63行到65行的定義
-A指定cpu體系結構
-O指定是什麼操作系統
-T指定映像類型,如standalone、kernel、ramdisk、multi、firmware、script、filesystem等
-C指定映像壓縮方式,如none(不壓縮)、gzip、bzip2。這裡不對uImage進行壓縮
-a指定映象在內存中的加載地址,映象下載到內存中時,要按照用MKIMAGE制作映象時,這個參數所指定的地址值來下載
-e 指定映象運行的入口點地址,這個地址就是-a參數指定的值加上0x40(因為前面有個MKIMAGE添加的0x40個字節的頭)
-n 指定映象名
-d 指定制作映象的源文件
上面命令中ZRELADDR在24行定義
ZRELADDR := $(zreladdr-y)在第17行有
include $(srctree)/$(MACHINE)/Makefile.boot
而這個Makefile.boot的中有
zreladdr-y := 0x30008000
所以ZRELADDR := 0x30008000