我正在阅读mmap
的{{3}}并且落在这一行上:
PROT_NONE 可能无法访问页面。
将文件映射到内存但从不访问它是否有用?
答案 0 :(得分:15)
PROT_NONE
可用于实现guard pages,Microsoft具有相同的概念(MSDN)。
引用第一个链接:
...在内存分配期间分配额外的无法访问的内存 操作是一种减轻堆利用的技术 缓冲区溢出。这些防护页面是放置在其间的未映射页面 一页或更大页面的所有内存分配。警卫页面会导致 任何访问都会出现分段错误。
因此可用于实现网络接口,虚拟机和解释器等领域的保护。示例用法:pthread_attr_setguardsize, pthread_attr_getguardsize。
答案 1 :(得分:4)
PROT_NONE分配一个没有授予权限的连续虚拟内存区域。
正如其他人所提到的,这可以用来实现防护(触摸的页面导致段错误,用于捕获bug和安全目的)或“魔术”指针,其中PROT_NONE映射中的值将被解释为其他内容而不是一个指针。
另一种用途是当应用程序希望将多个独立映射映射为虚拟连续的映射时。这将通过首先使用PROT_NONE mmapping足够大的块,然后使用MAP_FIXED标志执行其他mmap调用以及在PROT_NONE映射区域内设置的地址来完成(使用MAP_FIXED会自动取消映射“被覆盖”的映射的一部分“)。
答案 2 :(得分:3)
一个可能的应用程序:您可以使用它来保留内存范围。分配这样的区域后,您可以使用指向该范围的指针作为特殊值。
一个可能的应用程序是一个透明地在“小”和“大”整数之间切换的库,具有一种小值优化的形式。一个大整数将表示为指向保存实际数字的内存区域的指针。一个小整数将是指向该保留存储区的指针,表示与该区域的偏移量相等的数字。 (我不是说这是实现这样一个库的最佳方法,只是它应该是可能的。)