外部符号值自动分配到RAM的末尾

时间:2016-05-14 08:47:57

标签: c gcc assembly bsp rtems

我不明白为什么extern符号等于链接器中定义的ram的结尾。

特别是,我在下面的rtems代码中看到了这种情况:

extern symbol "rdb_start" definition - start.S - line 155 -157

extern symbol "rdb_start" usage - bspgetworkarea.c - line 23-41

例如,当您在链接器中定义RAM大小0x800000并将输入地址设置为0x40000000时,则rdb_start值会自动对应于0x407FFFF0。如果您定义类似于rdb_start的任何其他符号并将其全局化为rdb_start,则会看到相同的结果。它的值自动分配给407FFFF0。

为什么?

1 个答案:

答案 0 :(得分:2)

在尝试让RTEMS在LEON3处理器上运行时,我遇到了类似的问题。 在询问Gaisler(制造LEON3的人)之后,我了解到rdb_start start代表“远程调试器启动”并且是外部设置的符号。当程序通过远程调试器(即GRMON)直接加载到RAM或通过引导加载程序(即mkprom)从PROM解压缩时,它用于设置堆栈指针。

堆栈指针通常应设置为内存的结尾 - 1个字。例如,具有8 MB RAM的LEON3处理器的存储空间通常在0x40000000-0x407FFFFF之间,堆栈指针设置为0x407FFFF0。

我可以通过将-stack选项传递给mkprom2并使用GRMON中的stack命令来设置新堆栈指针的值来更改rdb_start的值。

我希望这有助于下一个试图找出RTEMS背景下rdb_start的人!