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所支持的镜像类型
所有评论(0)