如何找到内存位置是否可以免费进行mmaping?

时间:2018-02-02 08:30:25

标签: posix mmap

我真的想要使用MAP_FIXED mmap选项保留一组特定的内存位置。但是,默认情况下,mmap将会munmap已经存在于这些地址的任何内容,这将是灾难性的。

如何告诉mmap“在此地址保留内存,但如果已经在使用中则会失败”?

2 个答案:

答案 0 :(得分:2)

只要省略MAP_FIXED,Linux就会免费使用请求的地址。如果请求的地址不是免费的,则使用其他地址,在这种情况下,您可以使用munmap

答案 1 :(得分:1)

您可以尝试使用mincore(2)

不幸的是,这将是非线程安全的。在检查区域状态之后,但在执行mmap之前,另一个线程可能会分配该区域。

如果您需要预留内存区域,只需使用PROT_NONE创建匿名私有映射。稍后您可以使用MAP_FIXED将不同的映射放在其上。

编辑:在Linux 5.0中,mincore行为看起来像change,因为它可能导致信息泄露(CVE-2019-5489):

  

因此,让我们通过简单地改变来避免信息泄露   语义是mincore()计算实际映射的页面,而不是页面   如果它们出现故障可能会被廉价地映射(注意"可能是"   旧语义的一部分:在缓存中实际上并不存在   保证你无论如何都可以访问它们,因为事情   像网络文件系统可能必须在使用前重新验证缓存。)

可以找到漏洞描述here