JIT de código de máquina y el bit de desactivación de ejecución

10

¿Cómo es el código de máquina generado en tiempo de ejecución (como la salida de un JIT), realmente ejecutado por la CPU si la CPU / OS tiene un bit de desactivación de ejecución?

Hasta donde yo sé, muchos procesadores y sistemas operativos modernos incluyen soporte para un bit NX (incluyendo Intel y ARM), que evita que se ejecute el código de máquina que se almacena en cualquier dirección que no sea ​​la sección de código de un binario compilado. Claramente, esta es una buena ventaja de seguridad, ya que evita los ataques de inyección de código shell.

Pero, ¿cómo pueden evitar esto los motores JIT, como LLVM, que generan dinámicamente código máquina?

Siler
fuente
Eche un vistazo a las implementaciones de Memory :: allocateMappedMemory para ver cómo se hace en LLVM. - Para * nix - Para Windows
zr01

Respuestas:

6

En Linux y muchos sistemas Posix, una aplicación puede cambiar la protección de algún rango del espacio de direcciones del proceso en la memoria virtual utilizando las llamadas al sistema mmap (2) y mprotect (2) .

Por lo tanto, el motor JIT podría usarlos (probablemente antes de la emisión del código de la máquina, pero tal vez después ).

Por cierto, en algunas arquitecturas, es posible que deba informar al caché de la CPU sobre segmentos de código de máquina recientemente disponibles, por ejemplo, __builtin_clear_cachede GCC.

Basile Starynkevitch
fuente