Я пишу программу, которая выполняет 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);
Это довольно неэффективно, так как я выделяю целую страницу (4 КБ) для всего, что я JIT, большинству из которых требуется всего несколько байтов.(Обратите внимание, что меня больше беспокоит количество отображений страниц и, возможно, падение на vm.max_map_count
, чем просто необработанный объем используемой оперативной памяти.) Для регулярного выделения памяти malloc
позаботится об этом, обернув (s)brk
и mmap
и отслеживание того, какие части страницы используются.Я, очевидно, не могу просто использовать malloc
, потому что он выделяет неисполняемую память.Есть ли простой способ получить подобное поведение при выделении исполняемой памяти, или мне придется использовать пользовательскую замену для malloc
, чтобы сделать это?