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

Extern Symbol Value Automatically Assigned to the End of RAM

我不明白为什么 extern symbol 等于链接器中定义的 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。

为什么?

我在尝试在 LEON3 处理器上将 RTEMS 设置为 运行 时遇到了类似的问题。 问了Gaisler(LEON3的制作人)才知道rdb_start start代表"remote debugger start",是外置符号。当程序通过远程调试器(即 GRMON)直接加载到 RAM 或通过引导加载程序(即 mkprom)从 PROM 解压缩时,它用于设置堆栈指针。

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

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

我希望这有助于下一个试图弄清楚 RTEMS 上下文中的 rdb_start 是什么的人!