7
votes

Exécution de code natif par JVM / CLR

Comment JVM / CLR exécute-t-il le code natif compilé JIT? Est-ce par une injection de code ou en copiant du code à la mémoire exécutable? Quels sont les appels système qui permet une exécution de code dynamique?


0 commentaires

3 Réponses :


2
votes

Je ne connais pas spécifiquement comment Java le fait, mais en général, vous inséreriez "piège" opcodes dans le flux d'instructions de l'interprète. Il y a deux opcodes dans la spécification JVM qui semble sur mesure à cet effet.

Si vous voulez savoir à coup sûr, il n'y a pas de meilleure réponse à la source: http: // Télécharger.java.net/jdk6/source/


0 commentaires

2
votes

Le point d'exécution de la langue commune contient une méthodyable pour chaque type avec des entrées pointant vers un code natif ou un talon natif du code géré JIT, puis fixez la méthodyable avec le pointeur du code natif juste créé.

MSDN a un Explication dans la section MethodDesc

Cette entrée de blog par Dave Notario explique comment fonctionne le compilateur CLR JIT.


0 commentaires

3
votes

Je peux expliquer comment nous le faisons dans CACAO VM (JVM JIT-JIT-SEUL). Premièrement, le code de la machine pour un procédé est généré dans un bloc de mémoire alloué en tas. Après la compilation, la longueur de code final est connue et une pièce de mémoire exécutable est allouée à l'aide de MMAP et du drapeau prot_exec (code CACAO correspondant ICI ). Ensuite, le code de la machine est copié dans la zone de gambage. Après cela, de nombreuses architectures nécessitent un mécanisme de rinçage en cache spécifique à la machine. À titre d'exemple, jetez un coup d'œil sur le fonction de cache-rinçage pour PowerPC 64. notamment sur I386 et X86_64, il n'y a rien à faire. Après cette étape, le processeur est prêt à exécuter le code nouvellement généré. Alternativement, les pages de mémoire déjà allouées peuvent être marquées exécutables avec MProtect . Notez que MMAP / MProtect sont des installations UNIX.


2 commentaires

Considérant le DEP et la séparation claire des données et du code exécutable et que la mémoire exécutable ne peut pas être écrite dans et que la mémoire de données ne peut pas être sauvegardée / exécutée, je serais toujours très intéressé par la manière dont il est fait sur les systèmes Win32 avec CLR / JIT.


@Abel Vous pouvez trouver Ceci article intéressant.