2009-07-04 17 views
6

¿Cómo ejecuta JVM/CLR el código nativo compilado JIT? ¿Es mediante alguna inyección de código o copiando código a la memoria ejecutable? ¿Cuáles son las llamadas al sistema que permiten la ejecución de código dinámico?Ejecución del código nativo por JVM/CLR

Respuesta

2

No sé específicamente cómo Java lo hace, pero en general se había insertar códigos de operación "trampa" en flujo de instrucciones del intérprete. Hay dos códigos de operación in the JVM spec que parecen hechos a medida para este propósito.

Si desea saber a ciencia cierta, no hay mejor respuesta que la fuente: http://download.java.net/jdk6/source/

2

El Common Language Runtime tiene una methodtable para cada tipo de entradas que apuntan a código nativo o un talón nativa a JIT el código administrado y luego arregle la tabla de métodos con el puntero al código nativo recién creado.

MSDN tiene una mayor profundidad en la sección explanation MethodDesc

This blog entry by Dave Notario explica cómo funciona el compilador JIT CLR.

3

puedo explicar cómo lo hacemos en CACAO VM (JIT una investigación de sólo JVM). En primer lugar, el código de máquina para un método se genera en un bloque de memoria asignada en el montón. Después de la compilación, se conoce la longitud final del código y se asigna un fragmento de memoria ejecutable usando mmap y el indicador PROT_EXEC (código CACAO relevante here). Luego, el código de la máquina se copia en el área mmapped. Después de eso, muchas arquitecturas requieren algún mecanismo de enjuague de caché específico de la máquina. Como ejemplo, eche un vistazo al cache-flushing function para PowerPC 64. Notablemente, en i386 y x86_64, no hay nada que hacer. Después de este paso, el procesador está listo para ejecutar el código recién generado. Alternativamente, las páginas de memoria ya asignadas pueden marcarse como ejecutables con mprotect. Tenga en cuenta que mmap/mprotect son instalaciones de Unix.

+0

Teniendo en cuenta el DEP y la clara separación de los datos y el código ejecutable y que la memoria ejecutable no se puede escribir de memoria de datos y no se puede saltar/ejecutada a, estaría todavía muy interesado en cómo se hace en los sistemas Win32 con CLR/JIT . – Abel

+1

@Abel Puede encontrar [este] (http://blogs.msdn.com/b/vcblog/archive/2009/05/21/dynamicbase-and-nxcompat.aspx) artículo interesante. – ghord

Cuestiones relacionadas