解压缩 gzipped 内核时出现 U-Boot 错误

U-Boot error while decompressing gzipped kernel

我有一台旧的嵌入式设备 (PHYTEC phyCORE-LPC3250),它运行古老的 U-Boot 1.3.3。

Linux 内核 uImage 被复制到 0x200000 的 NAND 闪存,然后启动:nboot 80100000 0 200000;bootm

如果 uImage 是从自扩展的 zImage 派生的,这很好用,但根据 this mailing list post,最好让 U-Boot 自己执行解压缩。

所以我尝试创建一个包含普通内核映像的 gzip 版本的 uImage,但解压失败:

Image Name:   Poky (Yocto Project Reference Di
Image Type:   ARM Linux Kernel Image (gzip compressed)
Data Size:    4057248 Bytes =  3.9 MB
Load Address: 80008000
Entry Point:  80008000
Verifying Checksum ... OK
Uncompressing Kernel Image ... Error: inflate() returned -3
GUNZIP: uncompress or overwrite error - must RESET board to recover

这种情况是 described in the FAQ,这表明问题是 运行 内存不足。但是我有 128 MB 的 RAM,从 0x80000000 开始,未压缩的内核只有 8 MB。

(我验证了 uImage 中的数据实际上是压缩过的。)

首先U-Boot将uImage从NAND复制到指定地址0x80100000的RAM中。然后将内核解压到uImageheader,0x80008000.

中指定的加载地址

由于我们的内核大约有 8 MB 未压缩,这意味着从 0x80008000 到大约 0x80800000 的内核内存与我们在 0x80100000 处复制 uImage 的位置重叠。

如果 uImage 没有被压缩,解压内核可以使用 memmove 它可以毫无问题地处理重叠的地址范围。 (如果加载地址 我们在 RAM 中复制它的地址,内核将执行 in-place。)

但是对于压缩后的uImage,如果我们在解压的时候覆盖了压缩后的数据,显然会解压失败。