我正在与海合会(MIPS)合作。
这是我的.ld文件中的相关部分。

MEMORY
{
   MEMORY_1                : ORIGIN = 0xB014D000,          N
   ....
   MEMORY_N                : ORIGIN = 0x9C00C800,          LENGTH = X*K
}
SECTIONS
{
   ....
 .my_section  ALIGN(32)           (NOLOAD)  : { } > MEMORY_1
   ....
}

全局缓冲区在代码处的防御:
static U32 __attribute__((section(".my_section"))) gBuffer[size];

我希望gBuffer[]地址在MEMORY_1,但是它的地址是0x9c0*****,即atMEMORY_N
为什么?我怎样才能修好它?
编辑:
我发现在删除NOLOAD指令之后,位于MEMORY_1的缓冲区。
(NOLOAD)指令将标记运行时不加载的节。链接器将正常处理该节,但将对其进行标记,以便程序加载器不会将其加载到内存中。
我需要使用(空载)指令。对所描述的行为有什么解释?
如何在缓冲区未移动到意外内存的情况下使用NOLOAD?
编辑2:
ld文件将如下所示(根据Matthias的建议):
_gBuffer_1 = address(MEMORY_1),
_gBuffer_2 = address(MEMORY_1) + _gBuffer_1_size,
_gbuffer_3 = address(MEMORY_1) + _gBuffer_1_size + _gBuffer_2_size.......

_gBuffer\u i\u大小必须在ld文件中定义。
我的代码和很多部分都有很多这样的缓冲区。
现在,每当有人希望添加一个新的缓冲区或改变现有的缓冲区(删除它或改变它的大小……),他必须通过LD文件并重新计算地址,这就是为什么我发现建议的方法不太容易维护。
最初的方法允许定义缓冲区,轻松地在程序员希望的每个部分中找到它,并将剩余的工作留给链接器。

最佳答案

我们刚刚遇到了同样的问题我们的工作是添加一个额外的间接层:

.my_section_noload ALIGN(32) (NOLOAD) :
{
  *(.my_section)
} > MEMORY_1

不知道为什么直接使用它会起作用。

07-26 05:26