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
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/
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.
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.
- 1. Estensione per Firefox: esecuzione del codice nativo?
- 2. Chiama codice Java non nativo da Python
- 3. visualizza codice nativo da Eclipse
- 4. Limita funzionalità codice nativo da Java
- 5. Caricamento FMOD puramente da codice nativo
- 6. Come inviare eventi da HTML in esecuzione all'interno di un UIWebView al codice Objective-C nativo?
- 7. Access AsyncStorage dal codice nativo
- 8. Differenza tra codice nativo e codice gestito?
- 9. Three.js portato su codice nativo?
- 10. Compilando java nel codice nativo?
- 11. passaggio valore da codice nativo iOS a cordova
- 12. Conversione da app .NET a codice nativo x86
- 13. Generare ed eseguire codice LLVM da nativo C/C++
- 14. Eclipse: interrompe codice da esecuzione (java)
- 15. esecuzione di codice MATLAB da PHP
- 16. esecuzione di codice lato server da JavaScript
- 17. in esecuzione codice C++ da python
- 18. Ottieni versione/codice codice Heroku da Dyno in esecuzione
- 19. Posso compilare Java nel codice nativo?
- 20. Java stringa di codice nativo fine
- 21. Android: come trasmettere l'intento dal codice nativo?
- 22. Mono Mkbundle produce il codice nativo
- 23. Android bitmap codice nativo - che collega problema
- 24. accesso java metodo sincronizzato dal codice nativo
- 25. Come creare callback tra codice Android e codice nativo?
- 26. Come ottenere il punto di interruzione nel codice nativo NDK e eseguire il debug del codice nativo in Android Studio?
- 27. Esistono compilatori di codice nativo Lisp?
- 28. Come compilare ocaml al codice nativo
- 29. Codice misto (nativo, gestito): come interagisce (tecnicamente)?
- 30. Come aggiungere codice Android nativo a LibGDX?
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
@Abel È possibile trovare [questo] (http://blogs.msdn.com/b/vcblog/archive/2009/05/21/dynamicbase-and-nxcompat.aspx) articolo interessante. – ghord