一、uImage
编译kernel之后,会生成Image或者压缩过的zImage。但是这两种镜像的格式并没有办法提供给uboot的足够的信息来进行load、jump或者验证操作等等。因此,uboot提供了mkimage工具,来将kernel制作为uboot可以识别的格式,将生成的文件称之为uImage。
uboot支持两种类型的uImage。
Legacy-uImage
在kernel镜像的基础上,加上64Byte的信息提供给uboot使用。FIT-uImage
以类似FDT的方式,将kernel、fdt、ramdisk等等镜像打包到一个image file中,并且加上一些需要的信息(属性)。uboot只要获得了这个image file,就可以得到kernel、fdt、ramdisk等等镜像的具体信息和内容。
Legacy-uImage实现较为简单,并且长度较小。但是实际上使用较为麻烦,需要在启动kernel的命令中额外添加fdt、ramdisk的加载信息。
而FIT-uImage实现较为复杂,但是使用起来较为简单,兼容性较好,(可以兼容多种配置)。但是需要的额外信息也较长。
二、Legacy-uImage
1、使能需要打开的宏
- 1
- 1
注意,这个宏在自动生成的autoconf.mk中会自动配置,不需要额外配置。
2、如何制作 & 使用
(1)工具mkimage
编译完uboot之后会在uboot的tools目录下生成mkimage可执行文件
(2)命令
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
(3)使用
将生成的Legacy-uImage下载到参数中指定的load address中,使用bootm ‘实际load address’命令跳转到kernel中。
但是注意,如果使用Legacy-uImage后面还需要跟上文件系统的ram地址以及dtb的ram地址,否则可能会导致bootm失败。
格式如下:
- 1
- 1
3、和zImage的区别
- 1
- 2
- 1
- 2
可以看出uImage比zImage多了64Byte,通过对比可以发现这64Byte的数据是加载zImage的头部的。
直接查看这64Byte的数据,通过od命令查看如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
Legacy-uImage是在zImage的基础上加上64Byte的头部。
下面通过Legacy-uImage的头部数据结构来解析这串数据。
4、格式头说明
uboot用image_header来表示Legacy-uImage的头部
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
可以发现这个头部就是64Byte。根据上述3来说明一下这个数据结构
- ih_magic
27 05 19 56
头部幻数,用来判断这个是否是Legacy-uImage的头部。为0x27051956则表示是一个Legacy-uImage。 - ih_size
00 17 cd f8
数据镜像长度。这里是0x17cdf8,也就是1560056,和我们前面测得的zImage的长度一致。 - ih_load
20 00 80 00
加载地址,也就是0x20008000, 和我们执行mkimage使用的参数一致。 - ih_ep
20 00 80 40
入口地址,也就是0x20008040, 和我们执行mkimage使用的参数一致。
三、FIT-uImage
0、原理说明
flattened image tree,类似于FDT(flattened device tree)的一种实现机制。其通过一定语法和格式将一些需要使用到的镜像(例如kernel、dtb以及文件系统)组合到一起生成一个image文件。其主要使用四个组件。
- its文件
image source file,类似于dts文件,负责描述要声称的image的的信息。需要自行进行构造。 - itb文件
最终得到的image文件,类似于dtb文件,也就是uboot可以直接对其进行识别和解析的FIT-uImage。 - mkimage
mkimage则负责dtc的角色,用于通过解析its文件、获取对应的镜像,最终生成一个uboot可以直接进行识别和解析的itb文件。 - image data file
实际使用到的镜像文件。
mkimage将its文件以及对应的image data file,打包成一个itb文件,也就是uboot可以识别的image file(FIT-uImage)。我们将这个文件下载到么memory中,使用bootm命令就可以执行了。
1、使能需要打开的宏
- 1
- 1
2、如何制作 & 使用
(1)its文件制作
因为mkimage是根据its文件中的描述来打包镜像生成itb文件(FIT-uImage),所以首先需要制作一个its文件,在its文件中描述需要被打包的镜像,主要是kernel镜像,dtb文件,ramdisk镜像。
简单的例子如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
语法可以参考蜗窝科技的u-boot FIT image介绍
注意,可以有多个kernel节点或者fdt节点等等,兼容性更强。同时,可以有多种configurations,来对kernel、fdt、ramdisk来进行组合,使FIT-uImage可以兼容于多种板子,而无需重新进行编译烧写。
(2)生成FIT-uImage
生成的命令相对Legacy-uImage较为简单,因为信息都在its文件里面描述了
- 1
- 2
- 1
- 2
最终在project X项目上生成了xprj_uImage.itb,这就是我们需要的FIT-uImage文件。
(3)使用
将生成的FIT-uImage下载到参数中指定的load address中,使用bootm ‘实际load address’命令跳转到kernel中。
uboot会自动解析出FIT-uImage中,kernel、ramdisk、dtb的信息,使用起来相当方便。
3、简单说明
FIT-uImage的格式类似于DTB。uboot会去解析出FIT-uImage中的configurations节点,根据节点选择出需要的kernel、dtb、rootfs。因此,在节点的基础上,添加很多节点信息,提供uboot使用。