2

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

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

外部符号“rdb_start”定义 - start.S - 第 155 -157 行

外部符号“rdb_start”用法 - bspgetworkarea.c - 第 23-41 行

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

为什么?

4

1 回答 1

2

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

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

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

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

于 2016-09-26T13:30:16.720 回答