使用LOADADDR构建内核uImage

use*_*586 8 linux-kernel embedded-linux u-boot

在构建内核时,我将LOADADDR作为"0x80008000":

make uImage LOADADDR=0x80008000
Run Code Online (Sandbox Code Playgroud)

你能帮忙了解一下这有什么用吗?我可以更改LOADADDR,LOADADDR的长度是否有任何限制?

saw*_*ust 12

(我假设您在使用U-Boot和LOADADDR的值时使用ARM.)

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

LOADADDR指定链接器将内核映像定位的地址.(对于一些架构(例如Blackfin)来说这是事实,但对于ARM则不然.

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

我可以更改LOADADDR吗?

是的,但根据(Vincent Sanders)的引导ARM Linux,这将违反ARM惯例:

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

(你问题中提到的uImage可能只是带有U-Boot包装器的zImage,所以引用确实适用.)

对LOADADDR的长度有任何限制吗?

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


附录

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

从(Russel King)引导ARM Linux开始,对此LOADADDR的约束是:

内核应该放在第一个128MiB的RAM中.建议将其加载到32MiB以上,以避免在解压缩之前重新定位,这将使引导过程稍微加快.

在引导原始(非zImage)内核时,约束更严格.在这种情况下,内核必须在系统的偏移处加载,等于TEXT_OFFSET - PAGE_OFFSET.

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