如何使用munmap自定义malloc

时间:2015-06-06 20:24:27

标签: c++ c malloc mmap

我试图重新编码malloc和免费功能,但我遇到了munmap的问题..

使用我的自定义malloc,我使用mmap创建一个内存池(例如:4Kb),因此我可以在调用malloc时将此池的索引作为地址返回。

这项工作很好,但是当我使用我的自定义免费(调用munmap)然后我想用我的自定义malloc分配其他东西时,我得到了一个段错误,就像我的整个游泳池被munmap解除分配一样..

示例:

Ask 1024 bytes to my malloc
-> First call so malloc allocate a pool of 4 * pagesize() (So 16 000     
bytes)
-> Return to me an addr than I use. (addr[0] = 42)
-> Free with munmap this address (munmap(addr, 1024))
-> re ask to my malloc 1024 bytes
-> Try to fill it with something and segfault.

我真的不明白发生了什么。 munmap是否删除了我的所有池?

抱歉英语很差..

1 个答案:

答案 0 :(得分:3)

您正在取消整个页面。

  

地址地址必须是页面大小的倍数。 包含指定范围的一部分的所有页面都是未映射的,,对这些页面的后续引用将生成SIGSEGV。如果指示的范围不包含任何映射页面,则不是错误。

munmap(2)

因此,当您munmap第一次分配时,您取消了整个第一页的映射。您应该等待仅在整个页面被取消分配时取消映射..或者根本不取消映射 - 只需确保两个进程不从同一页面获取内存,因此没有安全漏洞。