工作随笔--fit image 启动失败

发布时间 2023-08-01 17:28:33作者: LuckyBear0

内核启动失败,its文件的地址设置错误

 

 

原因:Its文件中的地址错误

load address:加载地址   load_addr      mkimage -a

entry point: 入口地址     entry_point     mkimage -e

bootm addressbootm 命令后面紧跟的地址,也就是加载地址  addr

kernel运行地址:zImage自解压后将kernel解压到实际运行的物理地址

所谓加载地址是指bootm将内核镜像文件拷贝到内存空间的位置,入口地址是加载地址确定后bootm从内核镜像文件中开始执行的地址理论上 zImage转化为uImage需要添加0x40长度的header 头,  所以entry_point == load_addr + 0x40;

bootmuImage处理:

  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相差 7570877fit_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的大小)与系统决定的内存区间20xc2000000(固定起始地址) ------- 0xc2000000+ offset(fit_uImage大小)不能有重合

或者满足 entry=load =image_start 条件,建议 entry load  两个地址设置为0xc3000000