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

make uImage LOADADDR=0x80008000

能否请您帮忙了解此功能的用途?我可以更改LOADADDR,对LOADADDR的长度有任何限制吗?

最佳答案

(我假设您使用的是基于U-Boot和LOADADDR值的ARM。)



LOADADDR指定链接器将内核镜像定位到的地址。 (对于某些架构(例如Blackfin)确实如此,但对于ARM则不是。

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



是的,但是根据(Vincent Sanders')Booting ARM Linux,这与ARM约定相反:

  • 尽管可以将zImage放置在内存中的任何位置,
    按照惯例,它是在物理RAM的基础上加
    的偏移量 0x8000 (32K)。这为参数块留出空间
    通常放置在偏移量0x100,零页异常向量和页上
    table 。这个约定很常见。

  • (您的问题中提到的uImage可能只是带有U-Boot包装器的zImage,因此引用确实适用。)



    长度”?如果您使用的是32位处理器,则该地址的长度为32位。

    ADDENDUM

    arch/arm/boot/Makefile 仅使用LOADADDR从zImage构建uImage。

    从(Russel King's)Booting ARM Linux对该LOADADDR的约束为:



    设备树或ATAG或initramfs的预期位置可能会在此LOADADDR上添加更多约束。

    10-07 18:46