Introduction aux Machines Virtuelles avec Ingénieur :, Responsables : Gaël Thomas, Gilles Müller EQUIPE REGAL LIP6 INRIA (Paris/France) un substrat de machine virtuelle : a substrate for Managed Runtime Environments 2 Les environnements d'exécution Les machines virtuelles Exécution code natif ( C, C++ ) source source Execution machine virtuelle (Java, C#) source source Machine Virtuelle vérificateur de byte-code Analyse Analyse Optimise Optimise Génère code binaire natif spécifique Génère code binaire natif spécifique Analyse Analyse Optimise Optimise Génère byte-code générique Génère byte-code générique Byte-code Byte-code générique générique à la volée (JIT) Interpréteur Threads Allocateur mémoire Ramasse miette () binaire binaire natif natif execution execution Machine Machine Virtuelle Virtuelle Analyse byte-code Analyse byte-code Évalue le byte-code ou Évalue le byte-code ou Compile et imise en code binaire Compile et imise en code binaire natif à la volée (JIT) natif à la volée (JIT) execution execution Problèmes Développement extrêmement long à réaliser! Comment tester une idée avec différents langages? Comment implémenter une nouvelle VM efficace pour de nouveaux langages? Comment étendre rapidement des langages existant? : a substrate for Managed Runtime Environments 3 : a substrate for Managed Runtime Environments 4
: un substrat de machine virtuelle : un substrat de machine virtuelle But de : aider à expérimenter dans les VM But de : aider à expérimenter dans les VM Objectif : factoriser les composants communs des VM Objectif : factoriser les composants communs des VM Just In Time : génération de code natif à la volée Just In Time : génération de code natif à la volée mémoire : alloue et collecte automatiquement la mémoire libre mémoire : alloue et collecte automatiquement la mémoire libre de Thread : créé et synchronise les threads de Thread : créé et synchronise les threads Personnalité Java (J3) Personnalité C# (N3 non maintenu) Personnalité R (Reactor) Personnalités Personnalité Java (J3) Personnalité C# (N3 non maintenu) Personnalité R (Reactor) ~ 25k loc Just In Time mémoire de Thread Just In Time mémoire de Thread ~ 500k loc : a substrate for Managed Runtime Environments 5 : a substrate for Managed Runtime Environments 6 : un substrat de machine virtuelle But de : aider à expérimenter dans les VM Objectif : factoriser les composants communs des VM Just In Time : génération de code natif à la volée mémoire : alloue et collecte automatiquement la mémoire libre de Thread : créé et synchronise les threads Personnalité Java (J3) Personnalité C# (N3 non maintenu) Personnalité R (Reactor) < 5% 5% du du code code ~ 25k loc d'un point de vue technique Just In Time mémoire de Thread ~ 500k loc : a substrate for Managed Runtime Environments 7 : a substrate for Managed Runtime Environments 8
Implementation de Architecture détaillée Choix d'implémentation: repose sur des composants externes à la volée (JIT) : LLVM [Lattner & Adve CGO 04] mémoire : MMTk [Blackburn et Al. ICSE 04] de Thread : Posix = glue entre les différents composants Entre JIT-C et gestionnaire mémoire = précis Entre le gestionnaire de Thread et le gestionnaire mémoire = multi-threadé Personality Compilation related function Call back Method Stub Invoke Invoke Generate Native LLVM Input/Output Generate Find global Roots Stack Maps Personality related functions Modify Header MMTk Trace Object gcmalloc/ write barrier Clone Object delegate Find thread Roots Posix Thread Thread Management/ handshake Operating System : a substrate for Managed Runtime Environments 9 : a substrate for Managed Runtime Environments 10 Architecture de la VM Minimal () pour le tutoriel Operating System : a substrate for Managed Runtime Environments 11 : a substrate for Managed Runtime Environments 12
Architecture de la et Gestion des Threads Point d'entrée du Garbage collector Backtrace (parcours de la pile d exécution) Traçage des variables globales Gestion des exceptions Thread Rendez-vous du garbage collector Scan de la pile d'exécution lors du Traçage des variables locales Méthode principale d'exécution : a substrate for Managed Runtime Environments 13 : a substrate for Managed Runtime Environments 14 Architecture de la Architecture de la : a substrate for Managed Runtime Environments 15 : a substrate for Managed Runtime Environments 16
(tag) (tag) [... ] * F (* param) TOY_PARAM(param) ; TOY_VAR(, val) ; [ init val ] val = g(param, val) ; return val ; * G (* a, * b) TOY_PARAM(a) ; TOY_PARAM(b) ; TOY_VAR(, res) ; res = a.dosomething(b) ; return res ; [... ] [... ] * F (* param) TOY_PARAM(param) ; TOY_VAR(, val) ; [ init val ] val = g(param, val) ; return val ; * G (* a, * b) TOY_PARAM(a) ; TOY_PARAM(b) ; TOY_VAR(, res) ; res = a.dosomething(b) ; return res ; [... ] Stack Maps : a substrate for Managed Runtime Environments 17 : a substrate for Managed Runtime Environments 18 (tag) (header gc) [... ] * F (* param) TOY_PARAM(param) ; TOY_VAR(, val) ; [ init val ] val = g(param, val) ; return val ; Call stack... param F val parameters Local vars - header - Bits de marquage - Bits de hash - Bits de lock (J3) - Bits personnalisables * G (* a, * b) TOY_PARAM(a) ; TOY_PARAM(b) ; TOY_VAR(, res) ; res = a.dosomething(b) ; return res ; [... ] Stack Maps a b G res parameters Local vars header Object : a substrate for Managed Runtime Environments 19 : a substrate for Managed Runtime Environments 20
(header gc) (tracer) - header - Bits de marquage - Bits de hash - Méthode de Traçage de l'objet - Bits de lock (J3) - Bits personnalisables destructor Op. delete - header - Bits de marquage - Bits de hash - Méthode de Traçage de l'objet Call stack Stack Maps... param F - Bits de lock (J3) - Bits personnalisables tracer markandtrace markandtrace markandtrace 1 2 VT C++ header Object tracer val tracer 3 : a substrate for Managed Runtime Environments 21 : a substrate for Managed Runtime Environments 22 (tracer) Architecture de la - header - Bits de marquage - Bits de hash - Méthode de Traçage de l'objet - Bits de lock (J3) - Bits personnalisables - Allocateur - Surcharge operator new - Appel à new interdit pour gc (paramètre opaque) : a substrate for Managed Runtime Environments 23 : a substrate for Managed Runtime Environments 24
Architecture de la (load ) Récupération du code (représentation intermédiaire LLVM) : a substrate for Managed Runtime Environments 25 : a substrate for Managed Runtime Environments 26 (load ) (load ) Récupération du code (représentation intermédiaire LLVM) Récupération du code (représentation intermédiaire LLVM) : a substrate for Managed Runtime Environments 27 : a substrate for Managed Runtime Environments 28
(load ) (generate ) Récupération du code (représentation intermédiaire LLVM) -runtime.bc Load at runtime bin bin -content.bc Récupération du code (représentation intermédiaire LLVM) : a substrate for Managed Runtime Environments 29 : a substrate for Managed Runtime Environments 30 (generate ) (generate ) Récupération du code (représentation intermédiaire LLVM) Récupération du code (représentation intermédiaire LLVM) No body Generate Materialize No body : a substrate for Managed Runtime Environments 31 : a substrate for Managed Runtime Environments 32
(generate ) (imize ) Récupération du code (représentation intermédiaire LLVM) Récupération du code (représentation intermédiaire LLVM) Generate No Materialize No body Generate Materialize No body : a substrate for Managed Runtime Environments 33 : a substrate for Managed Runtime Environments 34 (imize ) (imize ) Récupération du code (représentation intermédiaire LLVM) Récupération du code (représentation intermédiaire LLVM) Materialize No body : a substrate for Managed Runtime Environments 35 : a substrate for Managed Runtime Environments 36
( to native) ( Infos) Récupération du code (représentation intermédiaire LLVM) Récupération du code (représentation intermédiaire LLVM) func Stack Maps Native func Native func : a substrate for Managed Runtime Environments 37 : a substrate for Managed Runtime Environments 38 ( to native) Récupération du code (représentation intermédiaire LLVM) Native func Récupération du code (représentation intermédiaire LLVM) Generation d' Optimisation de l' Conversion de l' vers code natif Transmission des StackMaps (information variables locales) au : a substrate for Managed Runtime Environments 39 : a substrate for Managed Runtime Environments 40
lib/vmkit/mmtk/ A vos claviers! include/vmkit include/llvm Questions?.h Vmkit.h Thread.h Allocator.h.h.h LLVM /lib TOYVM (.h /.cc) (.h /.cc) (.h /.cc) util.h Tracers.cc (.h /.cc) : a substrate for Managed Runtime Environments 41 : a substrate for Managed Runtime Environments 42