Пользовательское выделение памяти и сборщик мусора Boehm

В моем проекте компилятора «снова-снова-снова-снова-снова» я реализовал замыкания как выделенную память с исполняемым префиксом. Таким образом, замыкание распределяется следующим образом:

c = make_closure(code_ptr, env_size, env_data);

c - это указатель на блок выделенной памяти, который выглядит следующим образом:

movl $closure_call, %eax
call *%eax
.align 4
; size of environment
; environment data
; pointer to closure code

closure_call - это вспомогательная функция, которая просматривает адрес, последний раз помещенный в стек, и использует его для поиска данных закрытия и указателя кода. Сборщик мусора Boehm используется для общего управления памятью, и когда на замыкание больше не ссылаются, он может быть освобожден сборщиком мусора.

В любом случае эта выделенная память должна быть помечена как исполняемая; фактически помечаются все страницы, которые он охватывает. По мере того как замыкания создаются и освобождаются, все больше и больше памяти кучи в процессе будет исполняться.

Из соображений защитного программирования я бы предпочел минимизировать объем исполняемой кучи. Мой план состоит в том, чтобы попытаться сохранить все закрытия вместе на одной и той же странице (ах), а также выделить и освободить исполняемые страницы по мере необходимости; т.е. реализовать собственный распределитель для закрытий. (Это проще, если все замыкания имеют одинаковый размер; поэтому первым шагом является перемещение данных среды в отдельное неисполняемое выделение, которым можно управлять в обычном режиме. Это также имеет смысл в защитном программировании.)

Но остающаяся проблема - это GC. Бем уже делает это! Я хочу каким-то образом сообщить Бёму о моих пользовательских выделениях и заставить Бома сказать мне, когда они могут быть привязаны к GC, но оставить это на меня, чтобы освободить их.

Итак, мой вопрос: в Boehm есть перехватчики, которые обеспечивают такое настраиваемое распределение?

9
задан Edmund 21 November 2011 в 00:27
поделиться