PROT_NONE
可用于实现保护页,Microsoft有同样的概念(MSDN)。
引用第一个链接:
... 在内存分配操作期间分配其他无法访问的内存是一种缓解堆缓冲区溢出利用的技术。这些保护页是未映射的页面,放置在一个页面或更大的所有内存分配之间。保护页会在任何访问时导致段错误。
因此,在实现网络接口、虚拟机和解释器等区域的保护方面很有用。一个示例用途:pthread_attr_setguardsize, pthread_attr_getguardsize。
PROT_NONE用于分配一个无权限的连续虚拟内存区域。
这是有用的,正如其他人所提到的,可以实现守卫(在触摸时会导致segfault的页面,用于漏洞调试和安全目的)或“魔法”指针,其中PROT_NONE映射中的值应被解释为不是指针的某些东西。
另一个用途是当应用程序希望将多个独立的映射作为虚拟连续映射时。这可以通过首先使用PROT_NONE mmap一个足够大的块,然后使用MAP_FIXED标志和设置在PROT_NONE映射区域内的地址进行其他mmap调用来完成(使用MAP_FIXED自动取消映射正在“覆盖”的部分映射)。
可能的一个应用场景是:您可以使用它来保留一段内存范围。分配此类区域后,您可以将指针指向该范围作为 特殊 值使用。
一个可能的应用场景是,创建一个库,它透明地在“小”和“大”整数之间进行切换,并具有一种小值优化形式。大整数将被表示为指向保存实际数字的内存区域的指针。小整数将被表示为指针指向此保留内存区域,表示等于该区域偏移量的数字。(我不是说这是实现这样的库的最佳方法,只是应该是可能的。)