何时发生不可读的内存页面?

时间:2011-03-02 15:42:28

标签: c memory

问题是不言自明的(我认为)。如果程序正在访问内存,一次说4个字节,那么内存何时碰巧是不可读的,而不是说,抓住垃圾?感谢。

3 个答案:

答案 0 :(得分:3)

每当程序不允许阅读时。

这是MMU允许或禁止访问内存的工作。这是操作系统的工作,用于指定允许哪个程序访问哪个内存区域。

答案 1 :(得分:3)

如果您正确分配/解除分配/访问内存,那么您将永远不会看到这一点。只有在你做错了事情时才会遇到这种情况。

通常,malloc是使用子分配内存管理器实现的。如果你要求malloc提供4个字节的堆内存,那么C运行时的内存管理器将分配一个更大的块,然后在该块中为你分配4个字节。然后,将从这些较大的块中的一个子块分配对少量存储器的后续请求。

您可以读取和写入尚未由malloc子分配的这些大型内存块的区域。这样做当然是未定义的行为。请不要这样做!您也可以读取和写入已释放的子块,只要较大的块尚未返回到系统。再说一次,请不要这样做。

当程序尝试访问已释放的地址并且包含该地址的内存块已返回到系统时,最常见的程序将出现不可读的内存错误(例如,分段错误或访问冲突)。这称为陈旧指针。

答案 2 :(得分:0)

实际上,如果您只参与正确对齐的读取操作,则无需担心。在实际硬件上,访问粒度始终位于 pages 级别,大小至少为4k。数学上,如果指针p位于有效页面中,p是某个对齐值m的倍数,它将页面大小n分开,那么

(p+0)/n = (p+1)/n = ... = (p+m-1)/n

即。 pp+1,...,p+m-1都指向同一页内。

如果p开头时未对齐,则可能存在比从未映射或无法读取的页面读取更大的可移植性问题。

相关问题