海湾合作委员会链接器。 CC3200 - 为什么数据从 SRAM 中的应用映像复制到 SRAM 中的另一个位置?

GCC Linker . CC3200 - why data is copied from Application Image in SRAM to another location in SRAM?

我注意到在 TI 的 CC3200 (ARMv8 / ARM Cortex M4) 示例中 startup_gcc.c 应用程序映像中的实际数据部分被复制到不同的位置。应用程序映像本身由 cc3200s 内部引导加载程序从闪存复制到 SRAM。 应用程序映像本身以这种方式加载到 SRAM 和 运行。

所以在我看来这完全是内存浪费,因为将数据部分复制到 SRAM 中的另一个位置。我错过了什么吗?从 ResetISR 中删除代码部分并更改链接器文件是否可以正常工作并且仅使用 SRAM 本身中的应用程序映像中的内存?

重置ISR:

uint32_t *pui32Src, *pui32Dest;
pui32Src = &__init_data;
for(pui32Dest = &_data; pui32Dest < &_edata; )
{
    *pui32Dest++ = *pui32Src++;
}

链接器:

.text :
{
    _text = .;
    KEEP(*(.intvecs))
    *(.bss.gpCtlTbl)
    *(.text*)
*(.ARM.extab* .gnu.linkonce.armextab.*)
. = ALIGN(8);
    _etext = .;
} > SRAM

.rodata :
{
*(.rodata*)
} > SRAM

.ARM : {
__exidx_start = .;
  *(.ARM.exidx*)
  __exidx_end = .;
} > SRAM

__init_data = .;

.data : AT(__init_data)
{
    _data = .;
    *(.data*)
. = ALIGN (8);
    _edata = .;
} > SRAM

没有复制的编辑链接器(并更改链接器):

.data
{
    _data = .;
    *(.data*)
. = ALIGN (8);
    _edata = .;
} > SRAM

加载到ROM时出现这种情况是正常的。我希望 __init_data 指向 ROM 中的地址,在这种情况下,副本将其从那里加载到 RAM。

在您的情况下,一切似乎都已在 SRAM 中,因此无需复制初始化数据。

唯一的问题是,内部引导加载程序如何知道映像有多大以及要复制多少?只要它在其图像大小中包含数据部分,那么您应该可以删除复制循环和 : AT(__init_data).

应该很容易测试,只要定义一个static int x = 42;然后if (x == 42) { led(on); }或类似的。

我不知道您正在使用的特定处理器的功能,但是在 X86 上,例如,这样做允许以只读方式加载图像。然后将数据复制到可以写入的页面(实际上特别是对于 X86,写时复制通常用于这些页面,以便多个进程可以从同一内存初始化 .data 而不是复制不是的页面实际上改变了)。

为了不需要这个步骤,图像需要填充各个部分以对齐页面,但人们通常希望图像尽可能小,同时包含所有需要的信息。