Как машинный код, сгенерированный во время выполнения (такой как вывод JIT), фактически выполняется ЦП, если ЦПУ / ОС имеет бит Отключение выполнения?
Насколько я знаю, многие современные процессоры и операционные системы включают поддержку для NX бит (включая Intel и ARM), защищающие машинный код , который хранится в любом адресе другой , чем секции коды скомпилированного двоичного файла из выполняются. Понятно, что это хорошее преимущество в плане безопасности, потому что оно предотвращает атаки с внедрением шелл-кода.
Но как JIT-движки, такие как LLVM, которые динамически генерируют машинный код, справляются с этим?
machine-code
jit
llvm
Сайлер
источник
источник
Ответы:
В Linux и многих системах Posix приложение может изменить защиту некоторого диапазона адресного пространства процесса в виртуальной памяти, используя системные вызовы mmap (2) и mprotect (2) .
Таким образом, механизм JIT мог бы использовать их (возможно, до выдачи машинного кода, но, возможно, после него).
Кстати, на некоторых архитектурах вам может потребоваться информировать кэш ЦП о новых доступных сегментах машинного кода, например,
__builtin_clear_cache
о GCC.источник