只读内存和堆内存

时间:2010-06-10 06:26:44

标签: c

AFAIK,在C语言的情况下,字符串文字存储在只读存储器中。 这实际上存在于硬件上。

根据我的知识堆在RAM上。如果我错了,我就错了。

堆只与只读内存有什么不同?

是OS依赖吗?

4 个答案:

答案 0 :(得分:3)

通常在硬件辅助下完成。

可以告诉硬件的虚拟内存子系统将页面标记为只读。当应用程序尝试写入只读页面时,硬件会生成操作系统捕获的错误。操作系统可以告诉应用程序尝试编写只读页面并结束程序。

因此OS / loader确保字符串文字所在的页面被标记为只读。

堆和只读内存是正交问题。

答案 1 :(得分:1)

它取决于操作系统和硬件。规范说他们可以放在只读内存中,而不是必须放在内存中。如果您正在为一个简单的嵌入式设备编写C语言,那么字符串就会被烧入rom,运行时内存将从RAM中分配出来;这些是物理上分开的(Harvard)。如果它是典型的类似unix的计算机,那么就有虚拟内存子系统将逻辑地址转换为页面中的物理地址,并且可以将某些页面标记为只读和一些可执行文件,但内存本身可以是数据或指令({{3 }})。

答案 2 :(得分:0)

通常是具有写保护设置的普通进程虚拟内存。

这是依赖于实现的,但处理器通常使用特殊的元数据块来控制对内存区域的访问,操作系统可以相应地设置它们。因此,字符串文字和所有其他不可更改的内容将加载到设置保护的区域中。因此,当程序试图修改该内存时,处理器内部的一个特殊单元会检查是否允许写入,如果没有,则会发出由操作系统处理的硬件中断。

答案 3 :(得分:0)

从hw的角度来看,RAM是RAM,它可以是R / W. “只读”存储器是由软件放置的属性;在一些架构上(几乎所有我们都习惯)有硬件支持使一部分内存不可写(在某种意义上,当你试图访问该内存中的地址时,会发生“异常”)。