Как скомпилированный код JIT введен в памяти и выполнен?

"Рассмотрите типичную архитектуру Windows x86 или AMD64, память разделена на исполняемые разделы, которые не могут быть записаны в и разделы данных, которые могут быть записаны в, но не могут быть выполнены (думайте DEP)".

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

Эти два абзаца, в то время как немного упрощенный, то, что я в основном понимаю JIT и модели памяти Windows. Я также знаю, что, когда я пытаюсь скопировать некоторый исполняемый код в памяти вручную и попытаться выполнить его, я буду обычно не мочь сделать это (если с Внедрением DLL).

Как разработчики JIT преодолевали это препятствие? Они используют кольцо 0 драйверов, или все сделано в непривилегированном режиме?

9
задан rene 7 March 2014 в 08:36
поделиться

1 ответ

Это просто делается с помощью функции Windows VirtualProtect () API. Он изменяет атрибуты страницы виртуальной памяти. Из PAGE_READWRITE, чтобы JIT-компилятор мог записать машинный код в PAGE_EXECUTE_READ, чтобы его можно было выполнить. Для этого не требуются специальные привилегии, поскольку страница принадлежит процессу, который также запускает JIT-компилятор.

10
ответ дан 3 November 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: