解压缩 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,如果我们在解压的时候覆盖了压缩后的数据,显然会解压失败。
我有一台旧的嵌入式设备 (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,如果我们在解压的时候覆盖了压缩后的数据,显然会解压失败。