2010-06-10 56 views
3

AFAIK,在C语言的情况下,字符串文字存储在只读存储器中。 这是在硬件上实际存在的位置。只读内存和堆内存

根据我的知识堆是在RAM.correct我,如果我错了。

从只读内存堆是如何不同?

是否依赖于操作系统?

回答

0

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

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

3

它通常在硬件帮助下完成。

硬件的虚拟内存子系统可以被告知将页面标记为只读。当应用程序尝试写入只读页面时,硬件会生成操作系统捕获的故障。操作系统可以告诉该应用程序试图写一个只读页面并结束您的程序。

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

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

0

从硬件角度来看RAM是RAM,它可以是R/W。 “只读”内存是由软件提供的属性;在某些体系结构上(几乎所有我们习惯的)都有硬件支持来使一部分内存不可写(在您尝试访问内存中的地址时发生“异常”的意义上)。

1

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