Машинний код JIT та біт виконання


10

Яким чином машинний код, сформований під час виконання (наприклад, вихід JIT), насправді виконується ЦП, якщо CPU / OS має біт відключення виконання?

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

Але як же обходити це двигуни JIT, як LLVM, які динамічно генерують машинний код?


Погляньте на реалізацію пам'яті Memory :: allocateMappedMemory, щоб побачити, як це робиться в LLVM. - Для * nix - для Windows
zr01

Відповіді:


6

У Linux та багатьох системах Posix програма може змінити захист деякого діапазону адресного простору у віртуальній пам'яті за допомогою системних викликів mmap (2) та mprotect (2) .

Тож двигун JIT міг би використовувати їх (можливо, до випуску машинного коду, але можливо після нього).

BTW, у деяких архітектурах вам може знадобитися повідомити кеш процесора про нещодавно доступні сегменти машинного коду, наприклад, __builtin_clear_cacheпро GCC.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.