1 FIT Image 概念
FIT:Flattened uImage Tree
its:image tree source
itb:image tree binary
FIT uImage 实质是将多个 kernel 和 dtb 文件以及组合配置信息打包进一个 image 文件( uImage ),its 利用 dts 语法按照一定结构描述出镜像信息和启动配置组合,通过 mkimage 和 dtc 工具生成类似 dtb 文件结构的 itb 文件(uImage)。
image source file mkimage + dtc transfer to target
+ -----------------> image file ----------------------> bootm
image data file(s)
编译:mkimage -f kernel_fdt.its kernel_fdt.itb
查看:mkimage -l kernel.itb
2 its 文件结构
2.1 root node
/dts-v1/;
/ {
description = "Various kernels, ramdisks and FDT blobs";
timestamp = <12399321>
#address-cells = <1>;
images {
image-1 { ... };
image-2 { ... };
...
};
configurations {
default = "config-1";
config-1 { ... };
config-2 { ... };
...
};
};
- 次要内容
description:uImage 的文本描述
timestamp:image 上次修改的 UTC 时间秒数,mkimage tool 会自动计算,可以不输入这个属性 - 主要内容(基本都是必须要有)
#address-cells:子节点 entry 和 load 地址占用32位单元的数量,如果没有 entry 和 load 地址时可以省略
images:包含一系列 kernel、ramdisk 等镜像子节点,至少含有一个子节点
configurations:包含一系列可用的节点组合配置并定义默认配置
2.2 image node
images {
image-1 {
description = "component sub-image description";
data = /incbin/("path/to/data/file.bin");
type = "sub-image type name";
arch = "ARCH name";
os = "OS name";
compression = "compression name";
load = <00000000>;
entry = <00000000>;
hash-1 {
algo = "md5";
value = [];
};
hash-2 { ... };
...
};
...
};
- 主要内容(基本都是必须要有)
description:该节点镜像的文本描述
type:镜像的类型
data:镜像对应的二进制文件的外部路径
compression:镜像压缩模式
os:OS 名称
arch:架构名称
entry:程序运行时的入口地址
load:镜像加载到内存的地址 - 次要内容
compatible:加载镜像的兼容属性
phase:U-Boot 阶段标识,spl 或者 u-boot
hash-n:每个哈希子节点包括 algo 和 value,algo表示节点使用的算法,value 表示根据指定算法为节点数据计算的单独哈希或校验和(长度 4,16 或者 20 字节),value 没看到手动填写,猜测 mkimage tool 会自动计算填充
2.3 configurations node
configurations {
default = "default configuration sub-node unit name";
config-1 {
description = "configuration description";
kernel = "kernel sub-node unit name";
fdt = "fdt sub-node unit-name";
loadables = "loadables sub-node unit-name";
compatible = "vendor,board-style device tree compatible string";
ramdisk = "ramdisk-1";
};
config-2 { ... };
...
};
- 主要内容(基本都是必须要有)
description:配置节点的文本描述
kernel 或者 firmware:对应的镜像子节点名称,两个属性同时存在会选择 firmware
fdt:对应的类型为 flat_dt 镜像子节点名称,u-boot 一般都需要
ramdisk:对应的类型为 flat_dt 镜像子节点名称,不是所有情况都需要 - 次要内容
fpga:对应 fpga 比特流的单元名称
compatible:启用CONFIG_FIT_BEST_MATCH时,此配置应自动匹配的 U-Boot 设备树根节点的 compatible 字符串
2.4 外部数据
images{
image-1{
data = /incbin/("path/to/data/file.bin");
// data-offset =
// data-size =
// data-position =
};
};
data 属性保存着每个镜像的数据,而且镜像数据直接在 property 结构的末尾开始存储。但是镜像数据也可以存储在 FIT 外部,通过 data-position 或者 data-offset 和 data-size 描述镜像信息,使得 FIT 结构变小。 使用 mkimage -E
命令时会创建 data-offset 和 data-size 属性用于查找 image;使用 mkimage -E -p [offset]
命令时会创建 data-position 和 data-size 属性用于查找 image;这些属性值不需要在 its 结构内书写,mkimage 会自动创建属性节点。
- data-size
镜像的大小,以字节为单位 - data-offset
镜像的外部存储地址相对于 FIT 末尾字节的偏移量 - data-position
镜像的外部存储地址相对于 FIT 起始字节的偏移量
data-size 属性在两种情况下都会存在,但是 data-offset 和 data-position 属性只会存在一个。对于多个 image 的使用情况,data-position 也只能显式的确定第一个 image 的位置信息,其余的 image 都是从第一个末尾顺序排列存储。
FIT 镜像一般都是把 data 嵌入到 FIT 结构内部,U-Boot 的 SPL 使用外部 data,也可以使用 data-offset 属性的存在性判断镜像类型。FIT 使用外部 data 时推荐块设备存储 512 bytes 对齐,mkimage 通过 ‘-B [bytes]’ 设置对齐大小。