【发布时间】:2017-10-07 04:32:46
【问题描述】:
在构建内核时,我将 LOADADDR 设为“0x80008000”:
make uImage LOADADDR=0x80008000
您能帮忙了解一下这个有什么用吗?可以更改 LOADADDR,对 LOADADDR 的长度有限制吗?
【问题讨论】:
标签: linux-kernel embedded-linux u-boot
在构建内核时,我将 LOADADDR 设为“0x80008000”:
make uImage LOADADDR=0x80008000
您能帮忙了解一下这个有什么用吗?可以更改 LOADADDR,对 LOADADDR 的长度有限制吗?
【问题讨论】:
标签: linux-kernel embedded-linux u-boot
(根据提到的 U-Boot 和 LOADADDR 的值,我假设您使用的是 ARM。)
你能帮忙了解一下这个有什么用吗?
LOADADDR 指定链接器将定位内核映像的地址。(这适用于一些体系结构(例如 Blackfin),但不适用于 ARM。
LOADADDR 指定 U-Boot 将定位内核映像的地址,并由 mkimage 实用程序存储在 U-Boot 标头中。通常,加载地址(用于放置在内存中)也是起始地址(用于执行)。请注意,uImage 文件通常只是带有 U-Boot 包装器的(自解压、压缩)zImage 文件。
我可以更改 LOADADDR,
是的,但根据(文森特·桑德斯)Booting ARM Linux,这将违反 ARM 约定:
(您的问题中提到的 uImage 可能只是带有 U-Boot 包装器的 zImage,因此引用确实适用。)
对 LOADADDR 的长度有限制吗?
“长度”?如果您使用的是 32 位处理器,则此地址的长度将为 32 位。
附录
arch/arm/boot/Makefile 仅使用 LOADADDR 从 zImage 构建 uImage。
来自(Russel King's)Booting ARM Linux 对此 LOADADDR 的约束是:
内核应放置在 RAM 的前 128MiB 中。推荐 它被加载到 32MiB 以上,以避免需要重新定位 在解压之前,这会使启动过程稍微 更快。
在启动原始(非 zImage)内核时,约束更加严格。 在这种情况下,内核必须以偏移量加载到系统中 到 TEXT_OFFSET - PAGE_OFFSET。
设备树或 ATAG 或 initramfs 的预期位置可以在此 LOADADDR 上添加更多约束。
【讨论】: