23

我正在阅读以下文档mmap并落在了这条线上:

PROT_NONE页面可能无法访问。

将文件映射到内存但从不访问它有什么用处?

4

3 回答 3

24

PROT_NONE可以用来实现保护页,微软也有同样的概念(MSDN)。

引用第一个链接:

...在内存分配操作期间分配额外的不可访问内存是一种减轻利用堆缓冲区溢出的技术。这些保护页是放置在一页或更大的所有内存分配之间的未映射页。保护页面在任何访问时都会导致分段错误。

因此在实现对网络接口、虚拟机和解释器等领域的保护时很有用。示例用法:pthread_attr_setguardsize, pthread_attr_getguardsize

于 2012-10-17T13:44:43.673 回答
11

PROT_NONE 分配一个没有授予权限的连续虚拟内存区域。

正如其他人所提到的,这对于实现警卫(出于查找错误和安全目的而导致段错误的页面)或“魔术”指针可能很有用,其中 PROT_NONE 映射中的值将被解释为指针以外的东西.

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

于 2017-12-01T14:20:45.597 回答
6

一种可能的应用:您可以使用它来保留内存范围。分配这样一个区域后,您可以使用指向该范围的指针作为特殊值。

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

于 2013-03-06T21:06:01.663 回答