U-Boot FIT Image

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]’ 设置对齐大小。

推荐链接

蜗窝科技 u-boot FIT image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怦然心动如往昔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值