我们如何加载Linux映像以适应内存中的位置

我们正在尝试将linux映像加载到DRAM的特定位置,DRAM结束地址是
我们从启动日志中得知的“mem device结束地址是0x80000000”的0x80000000.我们正在地址“0x5000000”加载我们的图像,并且在图像的variuos部分加载到大于“0x80000000”的某个地址之前,再次从启动日志中获取eaxmple

 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

它是一个相当大的列表,所以没有发布完整.但是我们可以在这里看到一件事.text部分大于DRAM结束地址,所以尽管我们在加载第一部分之后没有收到任何错误但是图像不应该被正确编码在加载其他部分但在此消息之后它会挂起.

    program load complete,entry point: 0x5000000,size: 0x92e7fc

我的问题是如何将这些不同的部分地址与我们的DRAM地址对齐,
这里可以使用objcopy实用程序来更改这些不同部分的地址.

在编译之前有没有办法设置这些节地址?
第二件事可能是这个Hang afer程序加载完成的原因.

最佳答案
从文件位置0x1000意味着它所说的.你在转储中有它:

[Nr]      Name           Type            Addr     Off    Size   ES Flg Lk Inf Al
...
[ 1]   .text            PROGBITS        c5000000 001000 5ac13e 00  AX  0   0 4096

它是.text段在文件中开始的位置,偏移量为0x1000.

But one thing we can see here .text section is greater than DRAM end address

不,它不是更大(至少在更大的意义上),它的编译期望它将被加载到内存中的地址0xc5000000.

so image should not be loded properly though we are not getting any error after loading first section it keeps on loading other sections

图像可以在任何地方加载,它只是用于加载目的的数据.

OTOH,如果加载到地址0xc5000000的部分意味着它说的话,文件会被加载到任何地方,因为你的RAM结束于0x7fffffff.

but after this message it hangs.

这是预期的.机器代码很少与位置无关,因此如果将它加载到与应该加载​​的位置不同的位置,它将无法工作.或者如果它甚至没有加载,那么你要执行什么?垃圾.

Is there any way to set these section addresses before compilation??

根据系统的不同,您可以选择以下两个选项之一或两者:

>设置页面翻译,使得虚拟地址从0xc5000000和向上映射到物理地址从0x5000000以及向上用于整个程序
>找到编译器正在使用的链接描述文件,并将初始部分地址从0xc5000000更改为0x5000000,google up,请参阅编译器/链接器文档

此外,入口点为0x5000000有点奇怪.并不是说这一定是错的,只是很少这样.我确保开始标签(或_start或其他任何东西)确实收到与.text部分开头相同的地址.如果出于某种原因,情况并非如此,那么链接器脚本或编译器/链接器命令行选项或加载器都会出现问题.

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...