【问题标题】:Building kernel uImage using LOADADDR使用 LOADADDR 构建内核 uImage
【发布时间】:2017-10-07 04:32:46
【问题描述】:

在构建内核时,我将 LOADADDR 设为“0x80008000”:

make uImage LOADADDR=0x80008000

您能帮忙了解一下这个有什么用吗?可以更改 LOADADDR,对 LOADADDR 的长度有限制吗?

【问题讨论】:

    标签: linux-kernel embedded-linux u-boot


    【解决方案1】:

    (根据提到的 U-Boot 和 LOADADDR 的值,我假设您使用的是 ARM。)

    你能帮忙了解一下这个有什么用吗?

    LOADADDR 指定链接器将定位内核映像的地址。(这适用于一些体系结构(例如 Blackfin),但不适用于 ARM。

    LOADADDR 指定 U-Boot 将定位内核映像的地址,并由 mkimage 实用程序存储在 U-Boot 标头中。通常,加载地址(用于放置在内存中)也是起始地址(用于执行)。请注意,uImage 文件通常只是带有 U-Boot 包装器的(自解压、压缩)zImage 文件。

    我可以更改 LOADADDR,

    是的,但根据(文森特·桑德斯)Booting ARM Linux,这将违反 ARM 约定:

    • 尽管能够将 zImage 放置在内存中的任何位置, 约定它是在物理 RAM 的基础上加载的 0x8000 (32K) 的偏移量。这为参数块留下了空间 通常放置在偏移量 0x100、零页异常向量和页 表。这种约定非常普遍。

    (您的问题中提到的 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 上添加更多约束。

    【讨论】:

    • 感谢您的回复。是的,我使用的是基于 ARM 的开发板。我没有收到“LOADADDR 指定了链接器将定位内核映像的地址。”,请您帮忙。据我了解,链接器将链接所有“.o”并创建 vmlinux.o。我认为 LOADADDR 在构建 uImage 时不会起到任何作用,除了在 uImage 标头中放置相同的(LOADDR 值),如果它已经磨损,请纠正我。
    • LOADADDR 是虚拟的还是物理的?如果我们将 0x80008000 视为物理地址(因为此时 MMU 未启用),那么 0x80008000 将指向大于 2GB 的物理地址。如果我们的设备中有 2GB RAM,那么它将如何处理?
    • @user3693586 -- 这是一个物理内存地址,因为引导加载程序不会像您提到的那样启用 MMU。通常,物理 RAM 不会从地址零开始。我见过 ARM SoC 的 RAM 为 0x20000000 或 0x70000000。显然在你的板上它从 0x80000000 开始。物理地址 0 通常在 ARM 上具有内部引导 ROM,而不是读/写 RAM。有关内存映射,请参阅 SoC 的数据表或技术参考手册 (TRM)。
    • 感谢您的信息,现在我了解了 LOADADDR。我使用 hexdump 检查了 uImage 标头,可以看到 loadaddr 和入口点地址。在我的情况下, loadaddr 和入口点 addr 都是相同的。 #hexdump uImage |头-2 0000000 0527 5619 5b20 01e4 bf55 da50 6000 a8d5 0000010 0080 0080 0080 0080 5f32 d5d4 0205 0002
    猜你喜欢
    • 1970-01-01
    • 2014-11-21
    • 2020-09-15
    • 1970-01-01
    • 2016-06-15
    • 2019-07-22
    • 2015-04-18
    • 1970-01-01
    • 2023-02-11
    相关资源
    最近更新 更多