【发布时间】:2010-12-16 07:53:51
【问题描述】:
我有一个驻留在闪存中的程序,它将从闪存中运行。在程序的早期,数据段从闪存复制到内存。我正在使用类似(简化)的链接器脚本:
.text :
{
*(.text)
} > FLASH
_etext = .;
PROVIDE (etext = .);
.rodata :
{
PROVIDE(__COPY_DATA_START__ = .);
*(.rodata)
} > ram AT>flash
PROVIDE (__SDATA2_START__ = .);
.sdata2 :
{
*(.sdata2)
} > ram AT>flash
PROVIDE (__sbss2_start = . );
.sbss2 : {
*(.sbss2)
. = ALIGN(4)
} > ram AT>flash
PROVIDE (__sbss2_end = . );
PROVIDE (__SBSS2_END__ = .);
.data :
{
*(.data)
*(.gnu.linkonce.d*)
CONSTRUCTORS
*(.eh_frame)
} > ram AT>flash
PROVIDE (__END_COPY__ = .);
我希望这些部分在 4 字节边界上对齐(架构是 PowerPC 32 位)。一些数据部分包括子词项。我发现 ALIGN 指令对齐 RAM 中的 VMA 地址,但不对齐 LMA。所以我的 copy-to-ram 例程失败了,因为这两个区域没有逐字节对应。
我的复制程序看起来像
r3 = address in flash of _etext
r4 = address in ram of __COPY_DATA_START__
words to copy = (__END_COPY__ - COPY_DATA_START) / 4
while (words to copy)
* r4++ = *r3++
当循环到达对齐位时,目标指向一些填充字节,但源数据不包括对齐填充,因此数据太早放入内存中。
我可以从地图文件中看出这一点,因为它看起来像(人为的例子)
.rodata 0x00000000 0xb15 load address 0xfff13000
0x00000000 PROVIDE (__COPY_DATA_START__, .)
.sdata 0x00000b18 0x10 load address 0xfff13b15 <<< origin 0xb18 is aligned but load address hasn't moved on by the padding bytes
有人知道这个问题的解决方法吗?
谢谢
克里斯
【问题讨论】: