当编译linux的时候,运行make uImage,如果一切正常,最后会生成uImage。
如下具体讲解uImage生成过程:
1. 生成uImag的工具mkimage由arch/arm/boot/Makefile中的MKIMAGE定义
- MKIMAGE:=$(srctree)/scripts/mkuboot.sh
mkuboot.sh的作用是去找到是否存在”mkimage”,此工具是用来生成最后的uImage。
mkuboot.sh 首先检查toolchain是否拥有mkimage (使用-z来判空),如果没有,再检查系统中是否拥有mkimage;如果没有则报错。
注:其中使用type命令来查找。
type:Display information about command type (type [-afptP] name [name …])
== # type mkimage
==mkimage is /usr/bin/mkimage
2. 从makefile.boot中传入生成uImage的相关参数(e.g: arm/arm/mach-at91/Makefile.boot)
- ifneq($(MACHINE),)
- include$(srctree)/$(MACHINE)/Makefile.boot
- endif
3. 通过mkimage来生成uImage,其过程是加上0x40bytes的kernel头 on zImage.
- quiet_cmd_uimage=UIMAGE$@
- cmd_uimage=$(CONFIG_SHELL)$(MKIMAGE)-Aarm-Olinux-Tkernel/
- -Cnone-a$(LOADADDR)-e$(STARTADDR)/
- -n’Linux-$(KERNELRELEASE)’-d$$@
mkimage的参数如下:
- Usage:mkimage-limage
- -l==listimageheaderinformation
- mkimage[-x]-Aarch-Oos-Ttype-Ccomp-aaddr-eep-nname-ddata_file[:data_file…]image
- -A==setarchitectureto’arch’
- -O==setoperatingsystemto’os’
- -T==setimagetypeto’type’
- -C==setcompressiontype’comp’
- -a==setloadaddressto’addr’(hex)
- -e==setentrypointto’ep’(hex)
- -n==setimagenameto’name’
- -d==useimagedatafrom’datafile’
- -x==setXIP(executeinplace)
Load address 由下面代码获得
- ifeq($(CONFIG_ZBOOT_ROM),y)
- $(obj)/uImage:LOADADDR=$(CONFIG_ZBOOT_ROM_TEXT)
- else
- $(obj)/uImage:LOADADDR=$(ZRELADDR)
- endif
start address 由下面代码获得
- $(obj)/uImage:STARTADDR=$(LOADADDR)
由zImage生成uImage:
- $(obj)/uImage:$(obj)/zImageFORCE
- $(callif_changed,uimage)
- @echo’Image$@isready’
也可以自行用mkimage来生成uImage,
mkimage -A arm -O linux -T kernel -C none -a load_addr -e entry_addr -n name -d zImage uImage
e.g :mkimage -A arm -O linux -T kernel -C none -a 0x70008000 -e 0x70008000 -n linux-2.6.30 -d zImage uImage
其中:0x8000这32K 空间是:Note that the kernel uses 16K of RAM below the imageto store page tables. The recommended placement is 32KiB into RAM. (来自Documentation/arm/booting文件)