我正在编写一个执行JIT的程序,而我目前正在设置可执行内存,如下所示:
void *mem = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
// write the JIT output to mem
mprotect(mem, len, PROT_READ|PROT_EXEC);
然后我像这样清理它:
munmap(mem, len);
这是相当低效的,因为我为JIT的所有内容分配了整个页面(4KB),其中大多数只需要几个字节。 (请注意,我关心的更多是页面映射的数量,可能与vm.max_map_count
无关,而不仅仅是使用的RAM原始数量。)对于常规的内存分配,malloc
通过以下方式来解决此问题:包装(s)brk
和mmap
,并跟踪使用页面的哪些部分。我显然不能只使用malloc
,因为它分配了不可执行的内存。分配可执行内存时是否有一种简单的方法来获得类似的行为,还是我必须使用malloc
的自定义替代方法来做到这一点?