arm32上uImage镜像的生成过程
arch/arm/boot/.Image.cmd
:
cmd_arch/arm/boot/Image := arm-himix200-linux-objcopy -O binary -R .comment -S vmlinux arch/arm/boot/Image
objcopy
选项:
-O
: 输出目标文件格式,这里是二进制格式-R
: 移除目标段,这里移除目标的.comment端-S
: --strip-all
这里就是用arm-himix200-linux-objcopy
工具,将源文件vmlinux
生成目标二进制文件arch/arm/boot/Image
,中间移除.comment
段,并strip all
将符合信息去除。
arch/arm/boot/.zImage.cmd
:
cmd_arch/arm/boot/zImage := arm-himix200-linux-objcopy -O binary -R .comment -S arch/arm/boot/compressed/vmlinux arch/arm/boot/zImage
zImage
的来源与Image
有差异,规则无差异。
arch/arm/boot/.uImage.cmd
:
cmd_arch/arm/boot/uImage := /bin/sh ./scripts/mkuboot.sh -A arm -O linux -C none -T kernel -a 0x22008000 -e 0x22008000 -n 'Linux-4.9.37' -d arch/arm/boot/zImage-dtb arch/arm/boot/uImage
这里的./scripts/mkuboot.sh
脚本实际是调用mkimage
工具去生成uImage
。
mkimage
使用说明:
Usage: mkimage -l image
-l ==> list image header information
mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type'
-C ==> set compression type 'comp'
-a ==> set load address to 'addr' (hex)
-e ==> set entry point to 'ep' (hex)
-n ==> set image name to 'name'
-d ==> use image data from 'datafile'
-x ==> set XIP (execute in place)
mkimage [-D dtc_options] -f fit-image.its fit-image
使用选项:
-A
: 指定架构,这里是 arm-O
: 指定操作系统,这里是 linux 操作系统-C
: 指定压缩方法,这里没有压缩-T
: 指定镜像类型,这里是内核镜像-a
: 指定加载地址,这里是 0x22008000-e
: 指定入口地址,这里是 0x22008000-n
: 指定镜像名字,这里是 Linux-4.9.37-d
: 指定数据源,这里是 arch/arm/boot/zImage-dtb
在arch/arm/boot/Makefile
中可以看到zImage-dtb
的来源:
$(obj)/zImage: $(obj)/compressed/vmlinux FORCE
$(call if_changed,objcopy)
$(obj)/zImage-dtb: $(obj)/zImage $(DTB_OBJS_FULL) FORCE
@cat $(obj)/zImage $(DTB_OBJS_FULL) > $@
@$(kecho) ' Kernel: $@ is ready'
zImage-dtb
就是由zImage
镜像和$(DTB_OBJS_FULL)
目标组成的,这里配置了CONFIG_ARCH_HI3519AV100
,生成了hi3519av100-smp-flash.dtb
,所以zImage-dtb
就是由zImage
和hi3519av100-smp-flash.dtb
组成的。
可以看下面两个图的比较:
整个uImage
镜像生成的流程大概如下: