我们正在尝试将 linux 映像加载到特定位置的 DRAM 中,DRAM 结束地址是 0x80000000,我们从引导日志中了解到“mem 设备结束地址是 0x80000000”。我们正在将映像加载到地址“0x5000000”并且在图像中的 variuos 部分被加载到大于“0x80000000”的某个地址之前,例如从启动日志中再次举例
loading section to address 0xc5000000 from file position 0x1000, size is 0x5ac13e
上一行中“从文件位置 0x1000”的含义是什么。
加载的第一部分是 .text 部分,下面是我们的部分标题的 vmlinux 图像转储
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .text PROGBITS c5000000 001000 5ac13e 00 AX 0 0 4096
[ 2] .notes NOTE c55ac140 5ad140 000168 00 AX 0 0 4
[ 3] __ex_table PROGBITS c55ac2b0 5ad2b0 000fe0 00 A 0 0 4
[ 4] .rodata PROGBITS c55ae000 5af000 20a930 00 A 0 0 64
[ 5] __bug_table PROGBITS c57b8930 7b9930 0075fc 00 A 0 0 1
[ 6] .pci_fixup PROGBITS c57bff2c 7c0f2c 001a90 00 A 0 0 4
[ 7] .builtin_fw PROGBITS c57c19bc 7c29bc 0000cc 00 A 0 0 4
它是一个相当大的列表,所以没有发布完整的。但是我们可以在这里看到一件事。文本部分大于 DRAM 结束地址,所以图像不应该被正确加载,尽管在加载它保留的第一部分后我们没有收到任何错误在加载其他部分但在此消息之后它挂起。
program load complete, entry point: 0x5000000, size: 0x92e7fc
我的问题是如何将这些不同的部分地址与我们的 DRAM 地址对齐,是否可以在这里使用 objcopy 实用程序来更改这些不同部分的地址。
有没有办法在编译之前设置这些段地址?第二件事可能是这个 Hang afer 程序加载完成的原因。