我不明白为什么 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。
为什么?
最佳答案
我在尝试让 RTEMS 在 LEON3 处理器上运行时遇到了类似的问题。
问了 Gaisler(LEON3 的制造者)才知道 rdb_start
start 代表“remote debugger start”,是一个外部设置的符号。当程序通过远程调试器(即 GRMON)直接加载到 RAM 或通过引导加载程序(即 mkprom)从 PROM 解压缩时,它用于设置堆栈指针。
堆栈指针通常应设置为内存的末尾 - 1 个字。例如,具有 8 MB RAM 的 LEON3 处理器的内存空间通常在 0x40000000 - 0x407FFFFF 之间,堆栈指针设置为 0x407FFFF0。
通过将 -stack 选项传递给 mkprom2 并使用 GRMON 中的 stack 命令设置新堆栈指针的值,我能够更改 rdb_start
的值。
我希望这有助于下一个试图弄清楚 RTEMS 上下文中的 rdb_start
是什么的人!
关于c - 外部符号值自动分配到 RAM 的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37224609/