2009-07-04 11 views
6

In che modo JVM/CLR esegue il codice nativo JIT compilato? È per qualche iniezione di codice o copia di codice nella memoria eseguibile? Quali sono le chiamate di sistema che consentono l'esecuzione dinamica del codice?Esecuzione codice nativo da JVM/CLR

risposta

2

Non so in modo specifico come lo fa Java, ma in generale si inseriscono gli opcode "trap" nel flusso di istruzioni dell'interprete. Ci sono due codici opzionali in the JVM spec che sembrano fatti su misura per questo scopo.

Se si vuole sapere con certezza, non c'è risposta migliore di quello di origine: http://download.java.net/jdk6/source/

2

Il Common Language Runtime ha un methodtable per ogni tipo con voci che puntano a codice nativo o uno stub nativo JIT codice gestito e quindi aggiusta la metodica con il puntatore al codice nativo appena creato.

MSDN ha una più approfondita explanation nella sezione methoddesc

This blog entry by Dave Notario spiega come funziona il compilatore JIT CLR.

3

Posso spiegare come lo facciamo in CACAO VM (una ricerca JIT-only JVM). Innanzitutto, il codice macchina per un metodo viene generato in un blocco di memoria assegnato all'heap. Dopo la compilazione, la lunghezza finale del codice è nota e un chunk di memoria eseguibile viene allocato utilizzando mmap e il flag PROT_EXEC (codice CACAO rilevante here). Quindi, il codice macchina viene copiato nell'area mmapped. Successivamente, molte architetture richiedono un meccanismo di svuotamento della cache specifico per la macchina. Ad esempio, dai un'occhiata allo cache-flushing function per PowerPC 64. In particolare, su i386 e x86_64, non c'è nulla da fare. Dopo questo passaggio, il processore è pronto per eseguire il codice appena generato. In alternativa, è possibile contrassegnare le pagine di memoria già assegnate con mprotect. Si noti che mmap/mprotect sono servizi Unix.

+0

Considerando DEP e la chiara separazione dei dati e del codice eseguibile e che la memoria eseguibile non può essere scritta e la memoria dati non può essere saltata/eseguita, sarei ancora molto interessato a come è fatto sui sistemi Win32 con CLR/JIT . – Abel

+1

@Abel È possibile trovare [questo] (http://blogs.msdn.com/b/vcblog/archive/2009/05/21/dynamicbase-and-nxcompat.aspx) articolo interessante. – ghord

Problemi correlati