在构建内核时,我将LOADADDR设置为“0x80008000”:
make uImage LOADADDR=0x80008000
您能帮忙理解这个的用途吗?我可以更改LOADADDR吗?LOADADDR的长度有任何限制吗?
在构建内核时,我将LOADADDR设置为“0x80008000”:
make uImage LOADADDR=0x80008000
您能帮忙理解这个的用途吗?我可以更改LOADADDR吗?LOADADDR的长度有任何限制吗?
(我假设您使用的是ARM处理器,因为提到了U-Boot并且LOADADDR的值。)
请问你能帮忙理解这个的用途吗?
LOADADDR指定链接器放置内核镜像的地址。 (这在一些体系结构上是正确的(例如Blackfin),但对于ARM来说不是这样的。)
LOADADDR指定U-Boot放置内核镜像的地址,并由mkimage实用程序存储在U-Boot头中。通常,负载地址(用于放置在内存中)也是启动地址(用于执行)。请注意,uImage文件通常只是具有U-Boot包装器的(自解压缩的)zImage文件。
我可以更改LOADADDR吗?
可以,但根据(Vincent Sanders')Booting ARM Linux,这与ARM约定相反:
(您问题中提到的uImage可能只是具有U-Boot包装器的zImage,因此该引用适用。)
LOADADDR的长度是否有任何限制?
"长度"?如果您正在使用32位处理器,则此地址的长度将为32位。
补充说明
arch/arm/boot/Makefile仅在从zImage构建uImage时使用LOADADDR。
从(Russel King的)ARM Linux引导中,对该LOADADDR的限制如下:内核应位于前128MiB的RAM中。建议将其加载在32MiB以上以避免在解压缩之前需要重新定位,这将使启动过程稍微快一些。
当引导原始(非zImage)内核时,限制更为严格。在这种情况下,内核必须加载到系统等于TEXT_OFFSET-PAGE_OFFSET的偏移处。
设备树、ATAGs或initramfs的预期位置可能会对此LOADADDR添加更多限制。