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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.