¿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
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/
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.
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.
- 1. Extensión de Firefox: ¿ejecución de código nativo?
- 2. Código fuente del método nativo de Java
- 3. Android: MediaRecorder @ Código nativo
- 4. inspeccionar el código nativo
- 5. Ejecución segura del código Haskell no confiable
- 6. ¿Qué es el código nativo?
- 7. C# Tamaño del código y tiempo de ejecución del código
- 8. Ejecutando código nativo en Azure
- 9. Cómo devolver el texto del código nativo (C++)
- 10. Cómo traducir código Byte a código nativo de la máquina
- 11. pasando el valor del código nativo de iOS a cordova
- 12. ¿Por qué estoy obteniendo este UnsatisfiedLinkError con código nativo?
- 13. Three.js portado al código nativo?
- 14. ver código nativo de Eclipse
- 15. ¿Cómo validar las credenciales de dominio (del código nativo)?
- 16. genere y ejecute el código LLVM del nativo C/C++
- 17. Ejecución de liquibase dentro del código Java
- 18. ¿Qué desencadena la ejecución del código JavaScript?
- 19. Retraso sincrónico en la ejecución del código
- 20. ¿La compilación del código nativo en .Net elimina el MSIL por completo?
- 21. Ejecución del código de tiempo en Android
- 22. ¿Cómo detener la ejecución del código VBA?
- 23. Depurar código nativo en Motorola Droid
- 24. depuración de código nativo en Android Biblioteca
- 25. Código nativo de modificación automática en Android
- 26. ¿Podría extender Corona con código nativo?
- 27. Llamar código Java no nativo de Python
- 28. Cargando FMOD puramente de código nativo
- 29. Cómo compilar ocaml al código nativo
- 30. Diferencia entre el código nativo y el código administrado?
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
@Abel Puede encontrar [este] (http://blogs.msdn.com/b/vcblog/archive/2009/05/21/dynamicbase-and-nxcompat.aspx) artículo interesante. – ghord