我真的想要使用MAP_FIXED
mmap
选项保留一组特定的内存位置。但是,默认情况下,mmap
将会munmap
已经存在于这些地址的任何内容,这将是灾难性的。
如何告诉mmap
“在此地址保留内存,但如果已经在使用中则会失败”?
答案 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。