高效的可执行代码内存分配实现

3
我正在动态生成大量大小和寿命不可预测的可执行机器代码碎片。目前我使用一个天真的可执行mmap预分配区域,但这只是暂时的,因为最终会耗尽内存。我没有实现任何内存回收机制,也不想这样做:这是一个困难的问题(难以调试错误、碎片化、多线程等)。
我需要的是一个库,它实现了malloc/free协议,但启用了可执行位。
是否有任何malloc实现提供此选项(可以是编译时标志)?
进一步的细节如下以回答评论:
我的当前平台是Linux x86_64,但欢迎Windows和ARM 32/64支持(但不是必须的)。
内存永远不会与不同的进程共享,但分配器必须具备多线程意识,并且在这种情况下,如果可能的话,要具有可扩展性。

这是系统相关的。系统/架构是什么? - bolov
在同一时间内,是否可以为多个可执行文件使用相同的内存映射? - Stargateur
感兴趣的链接:https://dev59.com/XXA75IYBdhLWcg3wv77A,https://dev59.com/t1gR5IYBdhLWcg3wu_b4 - bolov
@Stargateur,您的意思是这个 mmap 是共享的还是私有的?如果有关系的话,它是私有和匿名的。 - user3368561
@JohnZwinck 如果可能的话,我希望能够在一个线程上使用malloc(),并在另一个线程上使用free(),但这不是必须的。目前内存使用是无界限的,但如果需要,它可以被限制。任何比我当前的“解决方案”更好的东西(一种不安全的黑客方法,当缓冲区满时会导致程序崩溃)都将受到欢迎。 - user3368561
显示剩余2条评论
1个回答

3
最简单的方法是使用池(arena)分配器。例如这个: https://github.com/philip-wernersbach/memory-pool-allocator。该实现在初始化期间调用了一次malloc(),但是在大多数系统上,如果您使用足够大的大小调用malloc(),它将使用mmap()。因此,您可以修改此库以调用mprotect()或类似的内容,使页面可执行,甚至可以直接替换malloc()调用mmap()(因为malloc()调用mmap()的阈值是可配置的,所以您可能不想依赖它)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接