【发布时间】:2013-03-09 07:48:52
【问题描述】:
我们正在尝试将 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 程序加载完成的原因。
【问题讨论】:
-
赏金固然好,但不一定能为您提供解决方案,因为该问题的信息量不够大,而且我们看不到您的代码。你基本上是在要求人们在黑暗中拍摄。
-
是的,Alexey 你已经很好地回答了我的问题,我认为对这个问题有更多的看法是个好主意。我不希望人们解决我的问题,因为那样我就不会学习自我,只是想有几个好主意
-
好点,其实。
-
@AmitSinghTomar:看看我的回答,Linux 内核在不同位置具有入口点和部分(程序头)是完全正常的(查看您自己的 Linux 的 vmlinux 文件)。重点是物理寻址与虚拟寻址。
标签: linux linux-kernel bootloader bootstrapping