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

标签 c gcc assembly bsp rtems

我不明白为什么 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/

相关文章:

c - 为什么使用 scanf 读入字符串缓冲区在有和没有符号 (&) 的情况下都有效?

c - 静态变量的奇怪情况仅出现在 gcc 的调试版本中

objective-c - ubuntu 12.04.3 : gcc 4. 8.2 in Objective-C

assembly - ARM 中只有两个操作数的 ADD 或 SUB

haskell - main=return()是一个程序吗?

c - 冒泡排序 C 编程

c - 为什么 ptrace 不识别函数?

c - 使用静态库构建共享库时符号的多重定义

c++ - 是否可以在 C++ 中对 C 结构进行子类化并在 C 代码中使用指向该结构的指针?

assembly - x86_64 : Can I change the VM flag in the EFLAGS register?