i.MX6UL平台fitImage含zImage可启动,替换为Image后启动失败求助
i.MX6UL使用内含未压缩Image的fitImage启动失败问题
正常启动情况
在i.MX6UL开发板上,内含zImage的fitImage可正常启动,启动日志如下:
U-Boot 2022.10+yocto (Apr 20 2023 - 21:44:39 +0000) CPU: Freescale i.MX6UL rev1.2 528 MHz (running at 396 MHz) CPU: Industrial temperature grade (-40C to 105C) at 43C Reset cause: WDOG Board: unknown (version=0x0) DRAM: 512 MiB Core: 37 devices, 18 uclasses, devicetree: separate WDT: Started watchdog with servicing (128s timeout) NAND: 512 MiB MMC: FSL_SDHC: 0 Loading Environment from MMC... OK In: serial Out: serial Err: serial SEC0: RNG instantiated Unsupported board variant! Net: eth0: ethernet@2188000 Normal Boot Hit any key to stop autoboot: 0 Booting fitImage from mmc0 ... switch to partitions #0, OK mmc0 is current device 4846904 bytes read in 214 ms (21.6 MiB/s) ## Loading kernel from FIT Image at 82000000 ... No configuration specified, trying default... Found default configuration: 'conf-map55-com.dtb' Using 'conf-map55-com.dtb' configuration Verifying Hash Integrity ... OK Trying 'kernel-1' kernel subimage Description: Linux kernel Type: Kernel Image Compression: uncompressed Data Start: 0x8200011c Data Size: 4809104 Bytes = 4.6 MiB Architecture: ARM OS: Linux Load Address: 0x83000000 Entry Point: 0x83000000 Hash node: 'hash-1' Hash algo: sha256 Hash value: 3edf87645b091fcb00d877f9ea851b2e8893aad196fc39a4588728ac6cf93d4d Hash len: 32 Verifying Hash Integrity ... sha256CACHE: Misaligned operation at range [8200011c, 824962dc] + OK kernel data at 0x8200011c, len = 0x00496190 (4809104) * ramdisk: using config 'conf-map55-com.dtb' from image at 0x82000000 * ramdisk: no 'ramdisk' in config * fdt: using config 'conf-map55-com.dtb' from image at 0x82000000 ## Checking for 'FDT'/'FDT Image' at 82000000 ## Loading fdt from FIT Image at 82000000 ... Using 'conf-map55-com.dtb' configuration Verifying Hash Integrity ... OK Trying 'fdt-map55-com.dtb' fdt subimage Description: Flattened Device Tree blob Type: Flat Device Tree Compression: uncompressed Data Start: 0x824963b8 Data Size: 35867 Bytes = 35 KiB Architecture: ARM Can't get 'load' property from FIT 0x82000000, node: offset 4809524, name fdt-map55-com.dtb (FDT_ERR_NOTFOUND) Hash node: 'hash-1' Hash algo: sha256 Hash value: 74d2031e5bdb030bcc137dfb013b01acb253dcc14e0153ab63d5e65e41a0caab Hash len: 32 Verifying Hash Integrity ... sha256CACHE: Misaligned operation at range [824963b8, 8249eff8] + OK Can't get 'load' property from FIT 0x82000000, node: offset 4809524, name fdt-map55-com.dtb (FDT_ERR_NOTFOUND) fit_uname=fdt-map55-com.dtb, fit_uname_config=conf-map55-com.dtb Booting using the fdt blob at 0x824963b8 of_flat_tree at 0x824963b8 size 0x00008c1b Loading Kernel Image @ comp: 0, load: 0x83000000, start: 0x8200011c, type: 2 @ load_buf: 0x83000000, image_buf: 0x8200011c, image_len: 4809104, unc_len: 33554432, load_end: 9df546ac @ load: 0x83000000, load_end: 0x9df546ac, image_len: 4809104 kernel loaded at 0x83000000, end = 0x83496190 using: FDT Using Device Tree in place at 824963b8, end 824a1fd2 ## Transferring control to Linux (at address 83000000)... Starting kernel ... ## Last log before kernel_entry(machid=0x0,r2=0x824963b8) Uncompressing Linux... done, booting the kernel. [ 0.000000] Booting Linux on physical CPU 0x0
问题现象
使用同一构建生成的未压缩Image替换zImage制作fitImage后,启动卡在移交控制权给Linux之后,无内核启动输出,日志如下:
U-Boot 2022.10+yocto (Apr 20 2023 - 21:44:39 +0000) CPU: Freescale i.MX6UL rev1.2 528 MHz (running at 396 MHz) CPU: Industrial temperature grade (-40C to 105C) at 43C Reset cause: WDOG Board: unknown (version=0x0) DRAM: 512 MiB Core: 37 devices, 18 uclasses, devicetree: separate WDT: Started watchdog with servicing (128s timeout) NAND: 512 MiB MMC: FSL_SDHC: 0 Loading Environment from MMC... OK In: serial Out: serial Err: serial SEC0: RNG instantiated Unsupported board variant! Net: eth0: ethernet@2188000 Normal Boot Hit any key to stop autoboot: 0 Booting fitImage from mmc0 ... switch to partitions #0, OK mmc0 is current device 13356892 bytes read in 585 ms (21.8 MiB/s) ## Loading kernel from FIT Image at 82000000 ... No configuration specified, trying default... Found default configuration: 'conf-map55-com.dtb' Using 'conf-map55-com.dtb' configuration Verifying Hash Integrity ... OK Trying 'kernel-1' kernel subimage Description: Linux kernel Type: Kernel Image Compression: uncompressed Data Start: 0x8200011c Data Size: 13319092 Bytes = 12.7 MiB Architecture: ARM OS: Linux Load Address: 0x83000000 Entry Point: 0x83000000 Hash node: 'hash-1' Hash algo: sha256 Hash value: f4250bf9ec13b505ab828da74fdb33ea67138de09dc861dd186ea4e9d29e4b80 Hash len: 32 Verifying Hash Integrity ... sha256CACHE: Misaligned operation at range [8200011c, 82cb3cdc] + OK kernel data at 0x8200011c, len = 0x00cb3bb4 (13319092) * ramdisk: using config 'conf-map55-com.dtb' from image at 0x82000000 * ramdisk: no 'ramdisk' in config * fdt: using config 'conf-map55-com.dtb' from image at 0x82000000 ## Checking for 'FDT'/'FDT Image' at 82000000 ## Loading fdt from FIT Image at 82000000 ... Using 'conf-map55-com.dtb' configuration Verifying Hash Integrity ... OK Trying 'fdt-map55-com.dtb' fdt subimage Description: Flattened Device Tree blob Type: Flat Device Tree Compression: uncompressed Data Start: 0x82cb3ddc Data Size: 35867 Bytes = 35 KiB Architecture: ARM Can't get 'load' property from FIT 0x82000000, node: offset 13319512, name fdt-map55-com.dtb (FDT_ERR_NOTFOUND) Hash node: 'hash-1' Hash algo: sha256 Hash value: 74d2031e5bdb030bcc137dfb013b01acb253dcc14e0153ab63d5e65e41a0caab Hash len: 32 Verifying Hash Integrity ... sha256CACHE: Misaligned operation at range [82cb3ddc, 82cbca1c] + OK Can't get 'load' property from FIT 0x82000000, node: offset 13319512, name fdt-map55-com.dtb (FDT_ERR_NOTFOUND) fit_uname=fdt-map55-com.dtb, fit_uname_config=conf-map55-com.dtb Booting using the fdt blob at 0x82cb3ddc of_flat_tree at 0x82cb3ddc size 0x00008c1b Loading Kernel Image @ comp: 0, load: 0x83000000, start: 0x8200011c, type: 2 @ load_buf: 0x83000000, image_buf: 0x8200011c, image_len: 13319092, unc_len: 33554432, load_end: 9df546ac @ load: 0x83000000, load_end: 0x9df546ac, image_len: 13319092 kernel loaded at 0x83000000, end = 0x83cb3bb4 using: FDT Using Device Tree in place at 82cb3ddc, end 82cbf9f6 ## Transferring control to Linux (at address 83000000)... Starting kernel ... ## Last log before kernel_entry(machid=0x0,r2=0x82cb3ddc)
已尝试操作
- 修改U-Boot的
CONFIG_SYS_BOOTM_LEN参数从默认0x1000000(16MB)改为0x2000000(32MB),问题未解决。
解决思路与线索
- 内核入口与加载地址验证:确认未压缩Image的实际入口地址是否匹配U-Boot传递的
0x83000000。zImage的入口是压缩引导程序,未压缩Image的入口是内核起始地址,需确保编译时内核的入口配置正确,且fitImage中entry属性与内核实际入口一致。可尝试将加载地址改为i.MX6UL常用的未压缩内核地址0x80800000,同步修改fitImage的load和entry属性。 - 内存冲突排查:检查未压缩内核加载后的内存范围(
0x83000000到0x83cb3bb4)是否与设备树、U-Boot或其他内存区域冲突。可调整内核加载地址,或通过U-Boot的bdinfo命令查看内存布局,确认可用内存区域。 - fitImage配置校验:制作fitImage时,确保内核子节点的
compression字段明确为uncompressed,type为Kernel Image;同时为设备树子节点添加load属性,避免加载时的警告(虽然zImage启动时也有该警告,但排除潜在影响)。 - 内核编译参数检查:确认未压缩Image的编译配置中未开启仅针对zImage的选项,比如
CONFIG_ZBOOT_ROM;检查内核是否编译为适合i.MX6UL的ARMv7架构,且启动相关配置(如CONFIG_ARM_APPENDED_DTB等)正确。 - 直接启动验证:跳过fitImage,直接用U-Boot的
bootm命令启动未压缩Image,确认内核本身是否能正常启动,排除fitImage打包过程的问题。 - U-Boot调试增强:在U-Boot中启用更多调试日志,或使用
bootm命令手动指定内核、设备树地址,观察内核启动早期是否有错误输出;也可通过JTAG调试内核入口后的执行流程。
内容的提问来源于stack exchange,提问作者BenKwan
相关产品推荐
相关产品推荐

