在哪里定义内存段?

dou*_*leE 3 c embedded compilation

我刚刚了解了不同的内存段,例如:文本,数据,堆栈和堆。我的问题是:

1-这些部分之间的边界在哪里定义?是在Compiler还是OS中?

2-编译器或OS如何知道每个部分属于哪些地址?我们应该在任何地方定义它吗?

kkr*_*mbo 5

从更专用的嵌入式系统而不是运行Linux之类的OS的通用计算平台的角度来看,这个答案是正确的。

这些部分之间的界限在哪里定义?是在Compiler还是OS中?

编译器和OS均不这样做。这是链接器确定内存部分的位置。编译器从源代码生成目标文件。链接器使用链接器脚本文件在内存中找到目标文件。链接描述文件(或链接指示符)文件是项目的一部分,并标识诸如ROM和RAM之类的各种内存类型的类型,大小和地址。链接器程序使用链接器脚本文件中的信息来了解每个内存的起始位置。然后,链接器将每种类型的内存从目标文件中定位到适当的内存部分中。例如,代码在通常位于ROM中的.text部分中。变量位于RAM中的.data或.bss节中。堆栈和堆也进入RAM。链接器填充一个部分时,它将了解该部分的大小,然后可以知道从何处开始下一个部分。例如,.bss节可以在.data节结束的地方开始。

堆栈和堆的大小可以在链接描述文件中指定,也可以在IDE中指定为项目选项。

创建项目时,嵌入式系统的IDE通常会自动提供通用链接描述文件。通用链接器文件适用于许多项目,因此您可能不必自定义它。但是,当您进一步自定义目标硬件和应用程序时,您可能会发现还需要自定义链接描述文件。例如,如果您在板上添加了外部ROM或RAM,则需要将有关该内存的信息添加到链接描述文件中,以便链接器知道如何在其中放置内容。

链接器可以生成一个映射文件,该文件描述每个节在内存中的位置。默认情况下可能不会生成地图文件,并且如果您要查看它,可能需要打开一个构建选项。

编译器或OS如何知道每个部分属于哪些地址?

好吧,我不相信编译器或操作系统实际上知道此信息,至少在您可以向他们查询信息的意义上。在链接器找到内存部分之前,编译器已完成其工作,因此编译器不知道该信息。操作系统,我该如何解释?嵌入式应用程序甚至可能不使用操作系统。操作系统只是一些为应用程序提供服务的代码。操作系统不知道也不在意内存段的边界在哪里。在操作系统运行时,所有这些信息已被烘焙到可执行代码中。

我们应该在任何地方定义它吗?

查看链接器脚本(或链接器指令)文件,并阅读链接器手册。链接描述文件被输入到链接描述文件中,并提供了大致的内存轮廓。链接器将所有内容定位在内存中,并确定每个部分的范围。