(I assume that you are using ARM based on the mention of U-Boot and the value of LOADADDR.)
Could you help to understand what it is?
LOADADDR indicates the address where the kernel image will be hosted by the linker. (This is true for several architectures (e.g. Blackfin), but not for ARM.
LOADADDR indicates the address where the kernel image will be located in U-Boot, and will be saved in the U-Boot header with mkimage . Typically, the download address (for placement in memory) is also the starting address (for execution). Note that the uImage file is usually a (self-extracting, compressed) zImage file with a U-Boot wrapper.
Can I change LOADADDR,
Yes, but according to (Vincent Sanders) ARM Linux boot , which is contrary to the ARM convention:
- Despite the possibility of placing zImage anywhere in the memory, you must admit that it is loaded into the physical memory base plus the offset 0x8000 (32K). This leaves space for the parameter block to usually be placed with an offset of 0x100, exception vectors and pages with zero page tables. This agreement is very common.
(The uImage mentioned in your question is probably just a zImage with a U-Boot wrapper, so the quote really applies.)
Is there a limit on the length of LOADADDR?
"Length"? If you use a 32-bit processor, the length of this address will be 32 bits.
ADDITION
arch / arm / boot / Makefile uses only LOADADDR to create uImage from zImage.
From (Russel King's) Booting ARM Linux , restrictions on this LOADADDR:
the kernel should be located in the first 128 MB of RAM. It is recommended that it be loaded above 32MiB to avoid the need to move to decompression, which will slightly facilitate the download process faster.
When you boot the raw (non-zImage) kernel, the restrictions become more stringent. In this case, the kernel must be loaded with an offset into the system equal to TEXT_OFFSET - PAGE_OFFSET.
The expected locations for the device tree or ATAG or initramfs may add additional restrictions for this LOADADDR.