AFAIK,在C语言的情况下,字符串文字存储在只读存储器中。 这实际上存在于硬件上。
根据我的知识堆在RAM上。如果我错了,我就错了。
堆只与只读内存有什么不同?
是OS依赖吗?
答案 0 :(得分:3)
通常在硬件辅助下完成。
可以告诉硬件的虚拟内存子系统将页面标记为只读。当应用程序尝试写入只读页面时,硬件会生成操作系统捕获的错误。操作系统可以告诉应用程序尝试编写只读页面并结束程序。
因此OS / loader确保字符串文字所在的页面被标记为只读。
堆和只读内存是正交问题。
答案 1 :(得分:1)
它取决于操作系统和硬件。规范说他们可以放在只读内存中,而不是必须放在内存中。如果您正在为一个简单的嵌入式设备编写C语言,那么字符串就会被烧入rom,运行时内存将从RAM中分配出来;这些是物理上分开的(Harvard)。如果它是典型的类似unix的计算机,那么就有虚拟内存子系统将逻辑地址转换为页面中的物理地址,并且可以将某些页面标记为只读和一些可执行文件,但内存本身可以是数据或指令({{3 }})。
答案 2 :(得分:0)
通常是具有写保护设置的普通进程虚拟内存。
这是依赖于实现的,但处理器通常使用特殊的元数据块来控制对内存区域的访问,操作系统可以相应地设置它们。因此,字符串文字和所有其他不可更改的内容将加载到设置保护的区域中。因此,当程序试图修改该内存时,处理器内部的一个特殊单元会检查是否允许写入,如果没有,则会发出由操作系统处理的硬件中断。
答案 3 :(得分:0)
从hw的角度来看,RAM是RAM,它可以是R / W. “只读”存储器是由软件放置的属性;在一些架构上(几乎所有我们都习惯)有硬件支持使一部分内存不可写(在某种意义上,当你试图访问该内存中的地址时,会发生“异常”)。