工作随笔--fit image 启动失败
内核启动失败,its文件的地址设置错误
原因:Its文件中的地址错误
load address:加载地址 load_addr mkimage -a
entry point: 入口地址 entry_point mkimage -e
bootm address:bootm 命令后面紧跟的地址,也就是加载地址 addr
kernel运行地址:zImage自解压后将kernel解压到实际运行的物理地址
所谓加载地址是指bootm将内核镜像文件拷贝到内存空间的位置,入口地址是加载地址确定后bootm从内核镜像文件中开始执行的地址理论上 zImage转化为uImage需要添加0x40长度的header 头, 所以entry_point == load_addr + 0x40;
bootm对uImage处理:
1.addr == load_addr
也就是说bootm后的地址等于加载地址,即已经将内核镜像(带头部)加载到-a 指定的内存地址load_addr中,
此时:addr == load_addr == entry_point - 0x40;
经过测试,基于当前的uboot配置不支持该方式
2.addr != load_addr:
从addr所在地址提取取出内核镜像头部信息中进行处理, 并将去掉头部的内核直接加载到-a指定的地址load_addr。然后进入load_addr进行内核引导(entry_point)。所以此时地址:
addr != load_addr == entry_point
上图报错对应的 bootm.c 源代码如下:
Compression: uncompressed
Data Start image_start: 0xc20000e0 (ubot内部计算得到的)
Data Size: 7508416 Bytes = 7.2 MiB
Architecture: ARM
OS: Linux
Load Address: 0xc20000e0
Entry Point: 0xc20000e0
## Flattened Device Tree blob at c4000000
Booting using the fdt blob at 0xc4000000
XIP Kernel Image
images.os.start = 0xC2000000=blob_start, images.os.end = 0xc27385bd=blob_end
blob_end-blob_start相差 7570877(fit_uImage大小)
load = 0xc20000e0, load_end = 0xc27292a0
load_end--load 相减就是zImage的大小0x7291c0
no_overlap= 1, image_start = 0xc20000e0
Load Address地址的有效范围设置的原则是:手动设置的内存区间1: Load Address ----- Load Address+offset (zImage的大小)与系统决定的内存区间2:0xc2000000(固定起始地址) ------- 0xc2000000+ offset(fit_uImage大小)不能有重合
或者满足 entry=load =image_start 条件,建议 entry ,load 两个地址设置为0xc3000000