mmap 内存保护中的 PROT_NONE 是什么目的?

24
我正在阅读mmap文档,看到了这一行:

PROT_NONE 表示不能访问页面。

将文件映射到内存中却从未访问它有何用处?


4
针对计算机科学家的恐慌。 - user529758
4
缓冲区溢出的保护页面 [参考资料: glibc]Guard pages for buffer overflows 是对缓冲区溢出进行保护的一种方法。在 glibc 中,使用 PROT_NONE 常量来创建一个无法访问的页面,使得如果程序尝试访问该页面(例如,因为缓冲区已经溢出到了该页面),就会触发一个 SIGSEGV 信号,从而使程序崩溃并避免缓冲区溢出攻击。 - Steve-o
1
同样适用于保留(一块)地址空间。 - wildplasser
3个回答

25

PROT_NONE可用于实现保护页,Microsoft有同样的概念(MSDN)。

引用第一个链接:

... 在内存分配操作期间分配其他无法访问的内存是一种缓解堆缓冲区溢出利用的技术。这些保护页是未映射的页面,放置在一个页面或更大的所有内存分配之间。保护页会在任何访问时导致段错误。

因此,在实现网络接口、虚拟机和解释器等区域的保护方面很有用。一个示例用途:pthread_attr_setguardsize, pthread_attr_getguardsize


14

PROT_NONE用于分配一个无权限的连续虚拟内存区域。

这是有用的,正如其他人所提到的,可以实现守卫(在触摸时会导致segfault的页面,用于漏洞调试和安全目的)或“魔法”指针,其中PROT_NONE映射中的值应被解释为不是指针的某些东西。

另一个用途是当应用程序希望将多个独立的映射作为虚拟连续映射时。这可以通过首先使用PROT_NONE mmap一个足够大的块,然后使用MAP_FIXED标志和设置在PROT_NONE映射区域内的地址进行其他mmap调用来完成(使用MAP_FIXED自动取消映射正在“覆盖”的部分映射)。


7

可能的一个应用场景是:您可以使用它来保留一段内存范围。分配此类区域后,您可以将指针指向该范围作为 特殊 值使用。

一个可能的应用场景是,创建一个库,它透明地在“小”和“大”整数之间进行切换,并具有一种小值优化形式。大整数将被表示为指向保存实际数字的内存区域的指针。小整数将被表示为指针指向此保留内存区域,表示等于该区域偏移量的数字。(我不是说这是实现这样的库的最佳方法,只是应该是可能的。)


1
Java虚拟机这样做是为了减少指针所需的内存量。 - user100464

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