在检测堆损坏的方法中,我试图实现一个哈希表来保存有关malloced内存的一些信息。这是在glibc内部完成的。当我们使用malloc()时,我们将地址和大小等信息放在哈希表中,当我们free()时,我们再次在glibc的free()本身中释放相应的哈希表条目。
为哈希表分配内存我已经mmap了一些内存(为此避免使用malloc,因为进程引发堆损坏的可能性也会破坏我的哈希表)。 问题是进程可以请求的malloc数量没有限制,这要求我的哈希表是可扩展的。由于我的哈希表适用于数组索引,因此用于哈希表的内存需要是连续的,因此使用索引我们可以轻松地访问存储桶或记录。现在,当哈希表使用所有内存时,我需要再次执行'mmap',使得此内存从前一个结束的地方开始。 mmap的man页面说我们可以为mmap提供一个地址,它将作为内核的提示来映射该地址的虚拟内存。对于哈希表,它看起来像一个contguouis内存块。我想问你一下这种方法的可靠性以及使用它的潜在缺陷是什么。
答案 0 :(得分:2)
如果是Linux,您可以使用mremap
。
如果您将哈希表编写为基于偏移而不是绝对指针,则可以传递MREMAP_MAYMOVE
标志,而不必担心分配失败。 (好吧,无论如何,直到耗尽虚拟内存。)
答案 1 :(得分:1)
这种方法有多可靠
MAP_FIXED
非常可靠: IF 您要求的内存可用,内核会将其提供给您。
潜在的缺陷是什么
显而易见的一点:其他一些东西可能会mmap
进入你想要延伸的区域,而你却输了。
如果您是为64位进程执行此操作,则可以mmap
,例如1TB的内存作为您的初始哈希表分配。只要您实际上没有访问它,假设您正在进行mmap
映射,那么MA_ANON
实际上是免费的(费用)。