"Рассмотрите типичную архитектуру Windows x86 или AMD64, память разделена на исполняемые разделы, которые не могут быть записаны в и разделы данных, которые могут быть записаны в, но не могут быть выполнены (думайте DEP)".
"Методы компиляций JIT, в оперативной памяти, ничего (обычно) не хранит к диску, вместо этого перемещает его, где следующий указатель команд может достигнуть его, изменяет указатель текущей команды (указывающий на JIT) для указания на недавно сгенерированный код и затем выполняет его".
Эти два абзаца, в то время как немного упрощенный, то, что я в основном понимаю JIT и модели памяти Windows. Я также знаю, что, когда я пытаюсь скопировать некоторый исполняемый код в памяти вручную и попытаться выполнить его, я буду обычно не мочь сделать это (если с Внедрением DLL).
Как разработчики JIT преодолевали это препятствие? Они используют кольцо 0 драйверов, или все сделано в непривилегированном режиме?
Это просто делается с помощью функции Windows VirtualProtect () API. Он изменяет атрибуты страницы виртуальной памяти. Из PAGE_READWRITE, чтобы JIT-компилятор мог записать машинный код в PAGE_EXECUTE_READ, чтобы его можно было выполнить. Для этого не требуются специальные привилегии, поскольку страница принадлежит процессу, который также запускает JIT-компилятор.