RAM和ROM内存段

3

不同的内存段包括.bss、.text、.data、.rodata等。

我无法确定它们中的哪些位于RAM中,哪些位于FLASH内存中,许多来源都在(RAM和ROM)内存的两个部分中提到了它们。

请公正地解释RAM和flash的内存段。

ATMEL工作室编译器
ATMEGA 32平台


ATMEL Studio编译器 ATMEGA 32平台 - Mohamed Moustafa
3
是的,这很重要。一些平台不会将任何ROM映射到进程内存空间中。 - David Schwartz
Atmel Studio编译器 - 它不存在。Atmel Studio IDE和gcc编译器是有的。我认为这对你来说现在是一个太复杂的话题了。它已经在数百篇文章中解释过了 - 如果你不理解它们 - 那就意味着现在还为时过早。要想有任何用处,你需要对C语言、链接脚本、启动代码和目标硬件有深入的了解。现在只需要记住 - 未初始化的静态变量被清零,自动变量则不会。 - 0___________
很多来源?请引用你的来源。如何在只读内存中定位变量数据段?看起来更可能是你误解了你所读的内容。 - Clifford
1
这里有各种小问题,特别是针对哈佛架构的垃圾。 - Lundin
显示剩余2条评论
3个回答

6
希望您能理解这些部分名称的典型用途。.text 是代码,.rodata 是只读数据,.data 是非零读/写数据(例如已在编译时初始化的全局变量),.bss 是假定为零、未初始化的读/写数据(未初始化的全局变量)。
因此,.text 和 .rodata 是只读的,因此它们可以在闪存或 RAM 中使用。.data 和 .bss 是可读/写的,因此需要在 RAM 中使用,但是为了将该信息放入 RAM 中,必须在断电时将其放在非易失性位置,然后复制到 RAM 中。因此,在微控制器中,.data 信息将存储在闪存中,引导代码需要将该数据复制到其在 RAM 的家中,代码期望在该处找到它。对于 .bss,您不需要所有那些零,只需要起始地址和字节数,引导程序就可以清除该内存。
因此,它们都可以/都存在于两种内存中。但是,典型用例是只读的用于闪存中,并且可读/写的用于 RAM 中。

4

它们位于项目链接脚本定义它们所在的任何位置。

一些目标将代码定位并执行在ROM中,而其他目标可能会在启动时将代码从ROM复制到RAM中,并从RAM中执行 - 通常是为了在更快的处理器上提高性能。因此,.text和.rodata可以位于R / W或R / O内存中。但是按照定义,.bss和.data不能位于R / O内存中。


非常感谢您的回答,它帮助我开始理解这个问题了。是否有任何参考资料或文档可以阅读,以更深入地了解这个主题? - Mohamed Moustafa
2
@MohamedMoustafa:你需要查看连接器/编译器的文档以及目标平台的参考手册/数据表。 - Clifford

0

只能写入RAM,不能写入ROM。 ROM保存着(BIOS)基本输入/输出系统,而RAM保存着正在运行的程序和使用的数据。 ROM比RAM小得多。 ROM是非易失性的(永久存储),而RAM是易失性的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接