构建内核时,我将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约定相反:
按照惯例,它是在物理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上添加更多约束。