JIT di codice macchina e bit di disabilitazione dell'esecuzione


10

In che modo il codice macchina generato dal runtime (come l'output di un JIT) viene effettivamente eseguito dalla CPU se la CPU / OS ha un bit di disabilitazione dell'esecuzione?

Per quanto ne so, molti processori e sistemi operativi moderni includono il supporto per un bit NX (inclusi Intel e ARM), che impedisce l' esecuzione del codice macchina archiviato a qualsiasi indirizzo diverso dalla sezione del codice di un file binario compilato. Chiaramente, questo è un bel vantaggio di sicurezza, perché impedisce attacchi di iniezione di codice shell.

Ma come fanno i motori JIT, come LLVM, che generano dinamicamente il codice macchina, a ovviare a questo?


Dai un'occhiata alle implementazioni di Memory :: allocateMappedMemory per vedere come è fatto in LLVM. - Per * nix - Per Windows
zr01

Risposte:


6

Su Linux e su molti sistemi Posix, un'applicazione può cambiare la protezione di alcuni intervalli dello spazio degli indirizzi di processo nella memoria virtuale usando le syscalls mmap (2) e mprotect (2) .

Quindi il motore JIT potrebbe usarli (probabilmente prima dell'emissione del codice macchina, ma forse dopo ).

A proposito, su alcune architetture, potrebbe essere necessario informare la cache della CPU sui segmenti di codice macchina appena disponibili, ad esempio __builtin_clear_cacheGCC.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.