使用U-Boot的mkimage制作FIT镜像或给镜像加协议头

1.环境信息:

  Version Info:U-Boot 2016.092.0+g199df35 (Nov 20 2016 - 12:55:17 +0800)

  ARCH:arm

  CPU:Freescale LS1020 Serial

  Cross Compiler: arm-linux-gnueabihf-

2.制作镜像: 

FIT镜像制作示例,FIT是内核、设备树、文件系统合并成一个文件的一种镜像,并且一个FIT镜像里边可能包含了很多个内核、设备树、文件系统等;

<1>准备文件:

    a.可执行程序:mkimage;

        该文件在U-Boot编译完成后,源码目录下/tools/有编译好的二进制程序;

    b.分开的镜像文件:zImage、rootfs.gz、dev-tree.dtb;

        zImage由内核源码编译后在arch/arm/boot/zImage目录下;

        rootfs.gz由busybox编译后,添加相关文件、目录后制作而成,参见 “busybox根文件系统制作”;

        dev-tree.dtb是设备树编译好后的二进制文件,在linux源码目录执行make dtbs可生成,也可用linux源码目录的/scripts/dtc/dtc工具编译;

    c.描述合并后镜像信息的文件:image_info.its;

        *.its文件需要用户自己编写,编写时可以参考U-Boot源码目录下的./doc/uImage.FIT/kernel.its文件编写;

<2>生成FIT镜像

  命令:./mkimage -f image_info.its fit.img

  其中:-f 表明要依据its文件内描述的文件制作FIT镜像;image_info.its文件是针对当前单板构建的镜像信息描述文件;fit.img是最后生成的FIT镜像文件名,文件名和拓展名自定义(file命令可以看到不管文件拓展名是啥,文件本质是:data)

  注:执行该条命令时,需要把its文件内描述的镜像文件放在指定的路径下,mkimage工具会依据its文件内描述自动加载文件,生成的fit.img文件也可以依据需求指定文件的路径,最好是绝对路径。

<3>给单个镜像文件加协议头

<3.1>内核镜像加协议头:

  命令:./mkimage -A arm -O linux -T kernel -C none -a 0x21000000 -e 0x21000040 -n "ARM32 Linux Kernel" -d zImage uImage

  执行结果示例

复制代码
[root@bogon mk_images]# ./mkimage -A arm -O linux -T kernel -C none -a 0x21000000 -e 0x21000040 -n "ARM32 Linux Kernel" -d zImage uImage
Image Name:   ARM32 Linux Kernel
Created:      Tue May 21 14:22:06 2019
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    9134592 Bytes = 8920.50 KiB = 8.71 MiB
Load Address: 21000000
Entry Point:  21000040
#注:0x21000000是uImage的开始地址,0x21000040是跳过开头的64bytes后zImage的地址。
复制代码

<3.2>文件系统镜像加协议头:

  命令:./mkimage -A arm -O linux -T ramdisk -C gzip -n "ARM32 Linux Kernel" -d ramdisk.gz rootfs

  执行结果示例

[root@bogon mk_images]# ./mkimage -A arm -O linux -T ramdisk -C gzip -n "ARM32 Linux Rootfs" -d ramdisk.gz rootfs
Image Name:   ARM32 Linux Kernel
Created:      Tue May 21 14:30:27 2019
Image Type:   ARM32 Linux Rootfs
(gzip compressed) Data Size: 4718592 Bytes = 4608.00 KiB = 4.50 MiB Load Address: 00000000 Entry Point: 00000000

<3.3>设备树镜像加协议头:

  命令:暂未测试

 

<3.4>合并镜像文件

  将三个加头后镜像文件合并到一个文件中:参见第二步合并镜像,其他方式暂未测试 

 注:U-Boot所支持的镜像类型:即-T后跟的参数类型  

复制代码
[root@bogon mk_images]# ./mkimage -T list
Invalid image type, supported are:
        Unknown image type  Unknown image type
        aisimage         Davinci AIS image
        atmelimage       ATMEL ROM-Boot Image
        filesystem       Filesystem Image
        firmware         Firmware
        firmware_ivt     Firmware with HABv4 IVT
        flat_dt          Flat Device Tree
        fpga             FPGA Image
        gpimage          TI Keystone SPL Image
        imximage         Freescale i.MX Boot Image
        invalid          Invalid Image
        kernel           Kernel Image
        kernel_noload    Kernel Image (no loading done)
        kwbimage         Kirkwood Boot Image
        lpc32xximage     LPC32XX Boot Image
        multi            Multi-File Image
        mxsimage         Freescale MXS Boot Image
        omapimage        TI OMAP SPL With GP CH
        pblimage         Freescale PBL Boot Image
        pmmc             TI Power Management Micro-Controller Firmware
        ramdisk          RAMDisk Image
        rkimage          Rockchip Boot Image
        rksd             Rockchip SD Boot Image
        rkspi            Rockchip SPI Boot Image
        script           Script
        socfpgaimage     Altera SOCFPGA preloader
        standalone       Standalone Program
        tee              Trusted Execution Environment Image
        ublimage         Davinci UBL image
        vybridimage      Vybrid Boot Image
        x86_setup        x86 setup.bin
        zynqimage        Xilinx Zynq Boot Image
        zynqmpimage      Xilinx ZynqMP Boot Image
复制代码

 

3.U-Boot识别和引导FIT镜像

<1>将镜像下载到目标单板

  一般采用tftp网络下载镜像文件到目标单板,

  命令:tftp 0x41000000 fit.img

  其中:0x41000000 是加载的位置,可以是内存也可以是Nor Flash的地址;

            (注:Nor Flash可能需要sf(SPI Flash SubSystem)或者其他命令实现,具体依据U-Boot功能)

  :fit.img文件应位于和目标板连在同一网络的服务器上,且服务器上有tftp服务,fit.img位于tftp服务的目录下。

            (注:CentOS的tftp服务目录不能更改,可能是因为xinet服务没有安装,安装后重启PC即可,重启服务没有用)

<2>U-Boot查看下载到单板的FIT镜像

  命令:iminfo 0x41000000

  其中:0x41000000 是下载的FIT镜像地址

<3>U-Boot从FIT镜像启动

  命令:bootm 0x41000000

  其中:0x41000000 是下载的FIT镜像地址

4.mkimage的详细解析

制作镜像的命令帮助信息:  

复制代码
[root@localhost u-boot]# ./tools/mkimage
使用示例:
  获取已制作好的镜像的信息
  ./tools/mkimage -l fit.img  
  
  制作FIT(Flattened device tree)镜像
  ./tools/mkimage -f image_info.its fit.img
  
  为单一镜像加镜像协议头
./tools/mkimage [-x] -A 处理器架构 -O 操作系统类型 -T 镜像类型 -C 压缩类型 -a 镜像地址 -e 内核镜像地址 -n 镜像名称 -d data_file[:data_file...] image
  mkimage工具的各参数含义
  -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) //设置镜像的地址(该镜像表示加已64byte文件头的镜像地址,该文件头属于U-Boot识别内核用)
  -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)     //设置是否在Flash内执行代码,当镜像存储在Nor Flash中时,可以在Nor中开辟空间运行程序。
  将文件系统大包到FIT镜像中:
./tools/mkimage [-D dtc_options] [-f fit-image.its|-f auto|-F] [-b <dtb> [-b <dtb>]] [-i <ramdisk.cpio.gz>] fit.img
<dtb> file is used with -f auto, it may occur multiple times.   -D => set all options for device tree compiler //设置编译设备树的命令字   -f => input filename for FIT source      //制作FIT镜像所需要的格式信息,一般是*.its文件,或者后面跟auto自动生成   -i => input filename for ramdisk file      //文件系统镜像,用于制作FIT镜像大包
  -l ==> list image header information //打印已制作好的镜像信息
Signing / verified boot not supported (CONFIG_FIT_SIGNATURE undefined) //当前boot不支持动态签名认证(校验)<需要定义宏CONFIG_FIT_SIGNATURE>
  -V ==> print version information and exit //打印当前制作镜像的软件工具版本
Use '-T list' to see a list of available image types //运行mkimage时加参数'-T list'显示当前mkimage所支持的镜像类型
复制代码

 

<think>嗯,用户之前问过关于FIT镜像生成后MD5校验值变化的问题,现在他们尝试使用mkimage命令来构建image.ub时遇到了错误,提示“Usage: mkimage -l image”。我需要先看看用户提供的错误信息,分析问题所在。 首先,用户执行的命令是`mkimage -f input.dts -t 0 image.ub`,但系统返回了用法说明,这说明命令格式不正确。根据错误信息,mkimage的用法分几种情况,尤其是构建FIT镜像时,正确的选项应该是`-f`指定输入文件,而用户可能误用了`-t`参数。我之前在之前的回答中建议使用`-t 0`来固定时间戳,但现在看来用户可能混淆了参数的位置者格式。 接下来,我需要检查mkimage的用法。根据用户提供的帮助信息,构建FIT镜像的正确命令应该是`mkimage -f input.dts image.ub`,而`-t`参数实际上是用于其他类型的镜像,比如指定镜像类型。用户错误地将`-t 0`放在这里,导致mkimage无法识别,从而抛出了帮助信息。 可能用户误解了`-t`参数的作用,我之前提到过使用`-t 0`来固定时间戳,但正确的做法可能是使用`-T`选项来指定类型,者在FIT镜像的情况下,时间戳可能需要通过其他方式设置,比如在DTS文件中显式设置`timestamp = <0>`,者在mkimage命令中使用其他选项。 另外,用户可能在之前的步骤中已经按照建议修改了DTS文件中的时间戳位置,但构建命令有误,导致时间戳未被正确应用。需要指出正确的命令格式,并解释参数的正确用法。 还需要考虑到用户可能的环境问题,比如mkimage版本的不同,导致参数支持有差异。建议用户检查mkimage的版本,并确认是否支持FIT镜像的构建。此外,用户可能需要确保输入文件input.dts的正确性,是否存在语法错误其他问题。 最后,用户可能需要一个清晰的步骤说明,包括正确的命令示例,以及可能的验证步骤,比如使用`dumpimage`来检查生成镜像的时间戳是否确实被固定。同时提醒用户确保所有相关文件路径正确,避免因路径问题导致的构建失败。</think>--- ### 问题解析 你尝试执行的命令 `mkimage -f input.dts -t 0 image.ub` 报错,原因是 **参数格式不匹配**。 从输出信息看,`mkimage` 的 `-t` 参数用于指定镜像类型(例如 `kernel`、`ramdisk` 等),而 `-t 0` 中的 `0` 不符合工具要求的值,导致工具直接输出了帮助信息。 --- ### 关键修正步骤 #### 1. **正确构建 FIT 镜像的命令格式** **FIT 镜像(Flattened Image Tree)的构建命令应为:** ```bash mkimage -f input.dts image.ub ``` - `-f` 指定输入的设备树源文件(`.dts` `.its`) - **无需 `-t` 参数**,因为 FIT 镜像类型由输入文件内容自动确定。 #### 2. **固定时间戳的附参数** 若需强制固定时间戳为 `0`,需通过 **设备树源文件(`.dts` `.its`)** 中显式定义: ```dts / { timestamp = <0>; // 在根节点子节点中设置 // 其他配置... }; ``` 使用 `mkimage` 的 `-D` 参数传递编译选项(部分版本支持): ```bash mkimage -f input.dts -D "-S 0" image.ub ``` - `-D` 用于传递设备树编译器(`dtc`)的选项,`-S 0` 表示固定时间戳为 `0`。 --- ### 参数详解 从报错信息中提取关键参数用途: | 参数 | 说明 | 示例 | |------|------|------| | `-A` | 指定架构(如 `arm`、`riscv`) | `-A arm` | | `-O` | 指定操作系统(如 `linux`、`u-boot`) | `-O linux` | | `-T` | 指定镜像类型(如 `kernel`、`ramdisk`) | `-T kernel` | | `-C` | 指定压缩格式(如 `gzip`、`lzma`) | `-C gzip` | | `-a` | 设置载地址(十六进制) | `-a 0x80000000` | | `-e` | 设置入口地址(十六进制) | `-e 0x80000000` | | `-d` | 输入二进制文件路径 | `-d zImage:devicetree.dtb` | --- ### 完整示例(非FIT镜像) 若需构建非FIT镜像(如普通内核镜像),命令格式如下: ```bash mkimage -A arm -O linux -T kernel -C none -a 0x10080000 -e 0x10080000 -d zImage uImage ``` - 此命令将 `zImage` 转换为 U-Boot 可引导的 `uImage`。 --- ### 验证镜像时间戳 生成 `image.ub` 后,可通过 `dumpimage` 检查时间戳是否固定: ```bash dumpimage -l image.ub ``` 观察输出中的 `Timestamp` 字段是否为 `0`。 --- ### 总结 - **核心问题**:误用 `-t` 参数导致命令格式错误。 - **解决方法**: 1. 使用 `mkimage -f input.dts image.ub` 构建 FIT 镜像。 2. 通过修改 `.dts` 文件 `-D "-S 0"` 固定时间戳。 - **验证手段**:通过 `dumpimage` 工具检查镜像元数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值