JIT машинного кода и бит отключения выполнения

10

Как машинный код, сгенерированный во время выполнения (такой как вывод JIT), фактически выполняется ЦП, если ЦПУ / ОС имеет бит Отключение выполнения?

Насколько я знаю, многие современные процессоры и операционные системы включают поддержку для NX бит (включая Intel и ARM), защищающие машинный код , который хранится в любом адресе другой , чем секции коды скомпилированного двоичного файла из выполняются. Понятно, что это хорошее преимущество в плане безопасности, потому что оно предотвращает атаки с внедрением шелл-кода.

Но как JIT-движки, такие как LLVM, которые динамически генерируют машинный код, справляются с этим?

Сайлер
источник
Взгляните на реализации Memory :: allocateMappedMemory, чтобы увидеть, как это делается в LLVM. - Для * nix - Для Windows
zr01

Ответы:

6

В Linux и многих системах Posix приложение может изменить защиту некоторого диапазона адресного пространства процесса в виртуальной памяти, используя системные вызовы mmap (2) и mprotect (2) .

Таким образом, механизм JIT мог бы использовать их (возможно, до выдачи машинного кода, но, возможно, после него).

Кстати, на некоторых архитектурах вам может потребоваться информировать кэш ЦП о новых доступных сегментах машинного кода, например, __builtin_clear_cacheо GCC.

Василий Старынкевич
источник