1、boot.img组成
rv1106的SDK中,内核kernel镜像为boot.img,该镜像为FIT镜像,在编译内核的时候,SDK会将生成的多个文件、镜像放入sysdrv/source/kernel/out/路径下:
其中,boot.its是生成FIT镜像的配置文件,fdt为设备树,kernel为内核镜像,resource为与硬件描述相关的镜像。
打开boot.its可看到:
/*
* Copyright (C) 2021 Rockchip Electronics Co., Ltd
*
* SPDX-License-Identifier: GPL-2.0
*/
/dts-v1/;
/ {
description = "FIT image with Linux kernel, FDT blob and resource";
images {
fdt {
data = /incbin/("fdt");
type = "flat_dt";
arch = "arm";
compression = "none";
load = <0xffffff00>;
hash {
algo = "sha256";
};
};
kernel {
data = /incbin/("kernel");
type = "kernel";
arch = "arm";
os = "linux";
compression = "none";
entry = <0xffffff01>;
load = <0xffffff01>;
hash {
algo = "sha256";
};
};
resource {
data = /incbin/("resource");
type = "multi";
arch = "arm";
compression = "none";
hash {
algo = "sha256";
};
};
};
configurations {
default = "conf";
conf {
rollback-index = <0x00>;
fdt = "fdt";
kernel = "kernel";
multi = "resource";
signature {
algo = "sha256,rsa2048";
padding = "pss";
key-name-hint = "dev";
sign-images = "fdt", "kernel", "multi";
};
};
};
};
最后生成的boot.img,应该是有fdt、kernel、resource组成。
其中,resource对应就是kernel目录生成的resource.img,其组成可以解包方式来分析。
使用resource_tool工具(该工具在luckfox-pico/sysdrv/tools/pc/toolkits/路径下),命令:
./resource_tool --verbose --unpack --image=resource
可看到输出的信息:
并且,在resource_tool所在目录下,会有out路径生成,存放着接包后的文件:
由此可知,resource由logo.bmp、logo_kernel.bmp、rk-kernel.dtb组成,而rk-kernel.dtb就是fdt,也就是设备树。
2、FIT镜像boot.img生成方法
查找网上资料可知,生成FIT镜像方法很简单,需要的就是mkimage工具,以及上述FIT镜像所需的文件。
网上找到的打包FIT镜像的指令为:
./mkimage -l boot.img
通过mkimage工具,直接识别当前位置下的its配置文件,打包生成最终FIT镜像boot.img。
但此时发现,使用上述方法生成的boot.img比SDK中生成的boot.img大小差了2k,并且将该镜像包烧录至开发板,也是报错,无法启动,会提示找不到FIT镜像。
这时候就回头再翻找SDK的脚本,最后发现在/project/scripts/路径下有一个脚本mk-fitimage.sh,该脚本最后第二句:
mkimage -f $target_its_file -E -p 0x800 $6
该指令即为FIT镜像打包生成boot.img的指令。
其中有一个0x800即2k的偏移量,之前的指令里,没有设置此偏移量,所以最后生成的镜像会小2k。
使用UltraEdit打开fdt可以看到:
使用UltraEdit打开resource可以看到:
此时可看出,设备树是在resource文件中0x800h开始的位置。
最后生成boot.img的指令:
./mkimage -f boot.its -E -p 0x800 boot.img
此时生成的boot.img与SDK原本生成的boot.img大小一致,烧录到开发板中,正常启动。