【发布时间】:2011-12-13 22:35:18
【问题描述】:
在一种检测堆损坏的方法中,我试图实现一个哈希表来保存有关分配内存的一些信息。这是在 glibc 内部完成的。当我们 malloc() 时,我们将地址和大小等信息放入哈希表中,而当我们 free() 时,我们再次在 glibc 的 free() 本身中释放相应的哈希表条目。
为了为哈希表分配内存,我已经映射了一些内存(避免使用 malloc,因为进程引起的堆损坏的可能性也会损坏我的哈希表)。 问题是进程可以请求的 malloc 数量没有限制,这要求我的哈希表是可扩展的。由于我的哈希表适用于数组索引,因此用于哈希表的内存需要是连续的,以便使用索引我们可以轻松地访问存储桶或记录。现在,当哈希表使用所有内存时,我需要再次执行“mmap”,以使该内存从前一个结束的地方开始。 mmap 的手册页说我们可以为 mmap 提供一个地址,这将作为内核在该地址映射虚拟内存的提示。对于哈希表,它看起来就像一块连续的内存。我想请教一下这种方法的可靠性以及使用这种方法的潜在缺陷是什么。
【问题讨论】:
标签: malloc virtual hashtable glibc mmap