Как скомпилированный код JIT вводится в память и выполняется? - PullRequest
9 голосов
/ 28 июля 2010

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

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

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

Как JIT-дизайнеры преодолели это препятствие?Они используют драйвер ring-0 или все делается в пользовательском режиме?

1 Ответ

10 голосов
/ 28 июля 2010

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

...