Non ho lavorato con macchine virtuali di qualità di produzione, ma qui ci sono i miei cinque centesimi.
.text
sezioni in eseguibili Unix appartengono al file che memorizza il codice eseguibile; in fase di esecuzione questa sezione file viene mappata su un'area di memoria allocata dal linker di sistema durante l'inizializzazione del programma, tutto qui (su Linux, è possibile vedere il layout delle sezioni in memoria in /proc/$PID/maps
).
Per quanto riguarda la compilazione JIT su sistemi Unix, posso solo pensare alle aree di memoria assegnate da mmap
system call con il flag PROT_EXEC
abilitato. Questa chiamata è specificata dagli standard POSIX e utilizzata dal linker del sistema Linux, ld.so
, per caricare qualsiasi file eseguibile nativo in memoria. Questa chiamata può essere utilizzata allo stesso modo per allocare nuove aree di memoria eseguibili in fase di esecuzione.
Il mucchio solito è spesso protetto da OS/MMU venga eseguito, come un qualsiasi file /proc/$PID/maps
suggerisce:
00dd4000-01292000 rw-p 00000000 00:00 0 [heap]
qui rw-p
significa che non ci sono dati a [heap]
possono essere eseguiti (anche se, ad esempio, non è il caso con CPU x86 a 32 bit senza PAE, non hanno la capacità hardware per impedire l'esecuzione di alcuni dati di memoria come codice), ma può essere letto/scritto.
Quindi una VM ha bisogno di un'area di memoria dedicata con permesso di esecuzione codice. Infatti, esaminiamo per rwx
aree di memoria in alcuni layout della memoria processo java:
# cat /proc/12929/maps | grep rwx # I run a Java VM with PID 12929
f3700000-f3940000 rwxp 00000000 00:00 0 # - an unnamed executable & writable region
Poi esecuzione di codice nativo è una questione di assemblaggio codice entrambe le posizioni-indipendente nativo JIT-compilato (come oggetti condivisi è compilato codice, con gcc
opzione -fPIC
) o utilizzando l'indirizzo restituito da mmap()
.
fonte
2013-09-24 12:58:10
Quando la JVM produce codice compilato diverso da JITing? – selig
La JVM non compila in modo permanente in bytecode su codice macchina nativo. Quindi non è memorizzato in modo persistente da nessuna parte. –
@AlexanderBird: That_is_ JITting. –