如何获取我的代码的结束地址

2024-03-07

我正在为一个课程项目从头开始编写一个实时操作系统。在将代码下载到芯片后,我想知道代码的结束地址,因为我计划将空闲内存用于堆栈空间,并且需要确保不会覆盖现有代码。

我听说 GCC 提供的 __end 变量是代码的结尾,但我不知道 __end 的含义是什么以及如何在我的代码中使用它。任何人都可以解释一下或提供一些材料的链接,因为我无法谷歌__end?

多谢。


正如 Adam Rosenfeld 指出的那样,您需要使用链接器控制文件来为您定义位于精确正确位置的一个或多个符号。

对于 gcc 和 binutils,您将使用 ld 的链接器脚本语法。请参阅 ld 的手册,了解我在这里省略的所有细节。它有点不透明,但如果您打算在嵌入式世界中花费大量精力,则应该花一些时间在它上面。它会给你带来回报。

在链接描述文件中,您需要在 .text 段之前和之后定义一个符号。

亚当提到PROVIDE()语法,它将起作用。但如果您可以保证您的名称是唯一的,您可能不需要将定义包装在 PROVIDE 中。请注意,这是您必须能够做出的保证,否则您以后可能会面临很多混乱的风险。

在我的脚本中,我只使用类似的东西:

__SDRAM_CS1 = 0x10000000;

使用常量地址定义符号,该地址(在本例中)引用我们决定 SDRAM 控制器将映射 SDRAM 内存的位置,在 C 中我将其声明如下:

extern unsigned char __SDRAM_CS1[];

这样它就可以用在需要知道 SDRAM 实际位置的代码中。

对于位于 .text 段末尾的符号,链接器脚本中将包含类似以下内容的内容

SECTIONS
{
    ...
    .text {
        _start_text = .;
        *(.text);
        ...
        _end_text = .;
    }
    ...
}

并将开始和结束符号声明为

extern unsigned char _start_text[];
extern unsigned char _end_text[];

在C中。那么,起始地址就是_start_text,文本段的长度(以字节为单位)是_end_text - _start_text.

请注意,我遗漏了很多细节。您可能有一些名为 .text 以外的名称的节,必须将其视为位于文本段中。一个主要的例子是只读数据,通常可以安全地定位在文本段中,因为已知它是const在嵌入式系统中,如果不需要,您宁愿不将其复制到宝贵的 RAM。此外,数据段的初始值设定项以及内部生成的全局对象构造函数列表都位于文本段附近。

是否在图像尺寸中包含这些内容是您在了解它们的用途后需要做出的设计决策。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取我的代码的结束地址 的相关文章

随机推荐