Brevet FR3105507A1 — publié le 20210625

Procédé et dispositif mettant en œuvre ce procédé pour générer et installer un code exécutable dans la mémoire d’un noyau d’une machine virtuelle depuis un hyperviseur. Ce procédé de génération et d’installation d’un code exécutable (CX1) d’au moins une première fonction (f1) dans la mémoire d’un noyau (K) d’une machine virtuelle (MV) est mis en œuvre par un hyperviseur (H), et comprend des étapes de : - obtention (E001) d’un code source (CS1) comprenant au moins la première fonction (f1) ; - obtention (E010) de données de configuration (CFG_MV) de la machine virtuelle, lesdites données de configuration comportant au moins une adresse (@F, @D) dans une mémoire du noyau de la machine virtuelle (MV) d’une fonction ou de données référencées par le code source (CS1) ; - obtention (E020) d’un code exécutable par compilation (CS1) dudit code source (CS1) en utilisant lesdites données de configuration (CFG_MV); - appel (E030) d’une fonction d’allocation de mémoire (malloc_MV) de ladite machine virtuelle, pour réserver un espace (EM1) dans la mémoire du noyau de la machine virtuelle (MV) pour un code exécutable (CX1) correspondant audit code objet ; - obtention dudit code exécutable (CX1) par assemblage dudit code objet en utilisant lesdites données de configuration (CFG_MV) et un résultat (@EM1) dudit appel (E030) à la fonction d’allocation de mémoire ; et - enregistrement (E040) dudit code exécutable (CX1) dans ledit espace mémoire (EM). Figure pour l’abrégé : Fig. 2 Procédé et dispositif mettant en œuvre ce procédé pour générer et installer un code exécutable dans la mémoire d’un noyau d’une machine virtuelle depuis un hyperviseur L’invention se rapporte au domaine général des logiciels informatiques. Elle concerne plus particulièrement la gestion des fonctions exécutées par une machine virtuelle. Dans le contexte actuel, l’utilisation de machines virtuelles est très répandue pour mutualiser et optimiser l’utilisation de ressources physiques d’un serveur, pour isoler des logiciels et augmenter la sécurité de leur utilisation, et pour s'abstraire des caractéristiques des machines physiques sur lesquelles les machines virtuelles sont exécutées. Il est connu d’utiliser un hyperviseur pour instancier et gérer une ou plusieurs machines virtuelles sur une même machine physique. Mais l’état actuel de la technique n’offre pas de solution satisfaisante pour surveiller les fonctions qui s’exécutent dans la mémoire du noyau d’une machine virtuelle. En effet, les techniques existantes actuelles sont exclusivement « in-VM » : la technique de sondage ou « probing » nécessite d’injecter un code dans une machine virtuelle depuis celle-ci ; cela nécessite un accès administrateur à la machine virtuelle. Une autre technique d’observation existante consiste à positionner des points d’observation dans une machine virtuelle. Cependant, lors de l’observation, la machine virtuelle est arrêtée, ce qui impacte les performances de la machine virtuelle. L’invention vise un procédé de génération et d’installation d’un code exécutable d’au moins une première fonction dans la mémoire d’un noyau d’une machine virtuelle, ce procédé étant mis en œuvre par un hyperviseur et comprenant des étapes de : - obtention d’un code source comprenant au moins la première fonction ; - obtention de données de configuration de la machine virtuelle, ces données de configuration comportant au moins une adresse dans une mémoire du noyau de la machine virtuelle, d’une fonction ou de données référencées par le code source ; - obtention d’un code objet par compilation du code source en utilisant les données de configuration; - appel d’une fonction d’allocation de mémoire de la machine virtuelle, pour réserver un espace dans la mémoire du noyau de la machine virtuelle pour un code exécutable correspondant au code objet ; - obtention d’un code exécutable par assemblage et édition de liens du code objet en utilisant les données de configuration et un résultat de l’appel de la fonction d’allocation de mémoire ; et - enregistrement du code exécutable dans ledit espace mémoire. Corrélativement, l'invention vise un dispositif de génération et d’installation d’un code exécutable d’au moins une première fonction dans une mémoire d’un noyau d’une machine virtuelle, ce dispositif comportant la machine virtuelle et un hyperviseur, ledit hyperviseur comportant un module apte à mettre en œuvre un procédé de génération et d’installation selon l’invention. Le code exécutable ainsi obtenu sera parfois appelé « premier code exécutable ». Les caractéristiques et avantages du procédé d’installation selon l’invention présentés ci-après s’appliquent de la même façon au dispositif d’installation selon l’invention, et vice versa. Dans la description, lorsqu’on dira qu’une instruction A est suivie par une instruction B, ou qu’une instruction B est consécutive à une instruction A, cela signifie soit que l’instruction A est suivie directement par l’instruction B, soit que les instructions A et B sont séparées par des instructions vides de type NOP (pour « No OPeration » en anglais). Ainsi, et d’une façon générale, l’invention propose en premier lieu une solution pour générer et installer depuis un hyperviseur un code exécutable dans la mémoire du noyau d’une machine virtuelle. L’invention étant mise en œuvre par l'hyperviseur, celui-ci peut surveiller les fonctions qui s’exécutent dans la machine virtuelle et installer le nouveau code exécutable dans la mémoire du noyau sans arrêter la machine virtuelle. Grace à la prise en compte des données de configuration, le code exécutable obtenu est spécifique à la machine virtuelle. Lorsque l’hyperviseur instancie plusieurs machines virtuelles, il peut générer et installer pour chacune de ces machines virtuelles, un code exécutable spécifique, généré à partir du même code source. Ainsi le sondage ou « probing » d’une machine virtuelle devient un mécanisme à la demande (« on-demand ») et à la volée (« on-the-fly »), indépendant de ce qui existe dans la machine virtuelle initialement, c’est-à-dire au moment de son développement ou/et de son instanciation initiale. Le sondage se fait depuis l’hyperviseur, et non plus depuis la machine virtuelle au moyen d’un compte administrateur. Conformément à l’invention, l’hyperviseur peut être de type natif (installé directement sur une machine physique), ou de type hôte (installé sur un système d’exploitation donné, qui est lui-même installé sur une machine physique). Le mécanisme de l’invention peut être utilisé sur n’importe quel système d’exploitation et sur n’importe quel type de machine virtuelle : machine virtuelle « classique » ou machine virtuelle contenant un container ou un unikernel. Pour mémoire, un unikernel est un petit noyau dans lequel est intégrée une seule application. Un tel mécanisme de sondage sur un unikernel permet ainsi de sonder des fonctions minimalistes, telles des fonctions réseau. Dans un mode de réalisation de l’invention, le procédé de génération et d’installation d’un code exécutable d’au moins une première fonction comporte en outre des étapes de : - obtention de l’adresse d’une dernière instruction de retour du premier code exécutable ; - déplacement à cette adresse d’au moins une instruction d’un deuxième code exécutable installé dans la mémoire du noyau de la machine virtuelle ; - enregistrement dans une adresse de cette mémoire, après l’instruction déplacée, d’une instruction de branchement à une adresse consécutive à l’adresse de ces instructions déplacées dans le deuxième code avant leur déplacement ; et - remplacement dans le deuxième code, de l’instruction déplacée par une instruction de branchement à l’espace mémoire du premier code exécutable. L’invention permet ainsi d’enrichir le deuxième code exécutable par le premier code exécutable. Lorsque le processeur du dispositif d’installation selon l’invention exécute le deuxième code, il est redirigé pour exécuter le premier code, puis exécute ensuite la fin du deuxième code. Le procédé étant mis en œuvre par l’hyperviseur, celui-ci peut contrôler que la fonction à enrichir ne s’exécute pas pour modifier son code exécutable comme mentionné ci-avant pour permettre son enrichissement. L’invention permet ainsi d’enrichir une fonction s’exécutant dans le noyau d’une machine virtuelle sans interrompre cette machine virtuelle. A titre d’exemple, le premier code peut mettre en œuvre un sondage pour effectuer des statistiques sur l’utilisation du deuxième code. Alternativement, le premier code peut correspondre à une fonction de gestion d’autorisations pour augmenter la sécurité de l’utilisation du deuxième code. En choisissant l’instruction déplacée, il est possible de modifier le moment de la redirection de l’exécution du deuxième code vers l'exécution du premier code. Il est à noter que les étapes de déplacement et d’enregistrement peuvent être mises en œuvre simultanément, ou l’une après l’autre, sans contrainte sur l’ordre de leurs mises en œuvre. Nous rappelons qu’une instruction de branchement, appelée aussi instruction de renvoi, ou de saut (instruction « jump » en anglais) est une instruction qui permet lorsqu'elle est exécutée, un renvoi sans retour, vers une adresse mémoire comportant une instruction à exécuter. Dans un autre mode de réalisation, le procédé selon l’invention comporte en outre des étapes de : - déplacement, à une adresse précédant l’espace mémoire du premier code exécutable, d’au moins une instruction d’un deuxième code exécutable installé dans la mémoire du noyau de la machine virtuelle ; - enregistrement à une adresse d’une dernière instruction de retour du premier code exécutable, d’une instruction de branchement à une adresse consécutive à l’adresse des instructions dans le deuxième code exécutable avant leur déplacement ; et - remplacement, dans le deuxième code exécutable, de l’instruction déplacée, par une instruction de branchement à ladite adresse précédant l’espace mémoire du premier code. Dans un autre mode de réalisation de l’invention, un espace d’agrégation est utilisé pour installer le premier code exécutable. Dans ce mode, le procédé comporte en outre des étapes de : - déplacement dans un espace mémoire dit d’agrégation, d’une instruction d’un deuxième code exécutable installé dans une mémoire du noyau de la machine virtuelle, cette instruction étant suivie par une instruction de branchement à une adresse qui suivait ces instructions dans le deuxième code avant leur déplacement ; - enregistrement dans l’espace mémoire d’agrégation avant l’instruction déplacée, d’une première instruction de branchement audit espace mémoire du premier code exécutable ; - remplacement d’une dernière instruction de retour du premier code par une deuxième instruction de branchement à une adresse dans l’espace mémoire d’agrégation, consécutive à celle de la première instruction de branchement ; et - remplacement dans le deuxième code, de l’instruction déplacée par une instruction de branchement à l’espace mémoire d’agrégation. L’ordre des étapes d’enregistrement et de remplacement n’est pas limitatif. Ce mode de réalisation permet d’organiser la mémoire du noyau de la machine virtuelle de sorte à pouvoir faire, à partir du deuxième code, un ou plusieurs renvois vers un ou plusieurs autres codes exécutables, en insérant des instructions de branchement dans l’espace mémoire d’agrégation. Conformément à ce mode de réalisation, l’instruction du deuxième code est déplacée dans l’espace d’agrégation, de préférence vers sa fin de sorte à laisser de l’espace pour enregistrer la première instruction de branchement à l’espace mémoire du premier code, et éventuellement enregistrer d’autres instructions de branchement à des espaces mémoire de codes exécutables supplémentaires, pour enrichir le deuxième code en outre avec ces codes supplémentaires. Dans un mode de réalisation, le procédé selon l’invention comporte en outre des étapes de : - déplacement dans un espace mémoire dit d’agrégation, d’au moins une instruction d’un deuxième code exécutable installé dans une mémoire du noyau ladite machine virtuelle ; - enregistrement dans l’espace mémoire d’agrégation, d’une première instruction de branchement à l’espace mémoire du premier code, suivie par une instruction de branchement à une adresse qui suivait lesdites instructions dans le deuxième code avant leur déplacement ; - remplacement d’une dernière instruction de retour du premier code par une deuxième instruction de branchement à une adresse dans l’espace mémoire d’agrégation, immédiatement consécutive à celle de ladite première instruction de branchement ; et -remplacement dans le deuxième code, de ladite au moins une instruction déplacée par une instruction de branchement à l’adresse de l’instruction déplacée dans l’espace d’agrégation. Conformément à ce mode de réalisation, l’instruction du deuxième code est déplacée dans l’espace d’agrégation, de préférence à son début de sorte à laisser de l’espace pour enregistrer la première instruction de branchement à l’espace mémoire du premier code, et éventuellement enregistrer d’autres instructions de branchement à des espaces mémoire de codes exécutables supplémentaires, pour enrichir le deuxième code en outre avec ces codes supplémentaires. Dans un mode de réalisation de l’invention, l’étape d’appel de la fonction d’allocation de mémoire prend en considération la taille d’une dite instruction de branchement en plus de la taille du premier code. Ainsi, une marge est prévue pour cette instruction dans l’espace mémoire du premier code exécutable. Dans un mode de réalisation dans lequel ladite au moins une instruction déplacée comporte au moins une instruction d’origine de branchement ou d’appel avec un décalage d’adresse vers une adresse cible, ledit procédé selon l’invention comportant des étapes de : - enregistrement, dans une zone atteignable par une instruction du type de l’instruction d’origine (branchement court, branchement long, appel court, appel long, branchement inconditionnel ou conditionnel,…) dans la mémoire du noyau de la machine virtuelle, d’une instruction de branchement long inconditionnel à l’adresse cible ; et - modification de l’instruction d’origine par une instruction modifiée de même type pointant vers cette instruction de branchement long inconditionnel. Ainsi, le pointage vers l'adresse cible est maintenu même en mettant en œuvre l'étape de déplacement de la ou les instructions du deuxième code. Ce mode de réalisation permet de mettre en place un mécanisme de sondage optimisé. Dans un mode particulier de mise en œuvre, le procédé selon l’invention permet l’installation d’au moins un code exécutable supplémentaire dans la mémoire du noyau de la machine virtuelle. Il comporte des étapes de : - enregistrement dans l’espace mémoire d’agrégation, après l’instruction de branchement à l’espace mémoire du premier code exécutable, d’une troisième instruction de branchement à un espace mémoire du code exécutable supplémentaire ; et - remplacement d’une instruction de retour du code supplémentaire par une instruction de branchement à une adresse dans l’espace mémoire d’agrégation, consécutive à celle de ladite troisième instruction de branchement. Le deuxième code peut ainsi être enrichi par le premier code exécutable, et par le code exécutable supplémentaire. L’invention permet d’enrichir un code par autant d’autres codes exécutables. L’invention vise également un programme d’ordinateur sur un support d’enregistrement, ce programme étant susceptible d’être mis en œuvre dans un ordinateur ou dans un dispositif de génération et d’installation conforme à l’invention, ce programme comportant des instructions adaptées à la mise en œuvre d’un procédé de génération et d’installation tel que décrit ci-dessus. Ce programme peut utiliser n’importe quel langage de programmation, et être sous la forme de code machine, code source, code objet, ou de code intermédiaire entre code source et code objet, tel que dans une forme partiellement compilée, ou dans n’importe quelle autre forme souhaitable. En particulier, ce programme peut être en langage Java, supporté par l’hyperviseur selon l’invention. En particulier, ce programme peut être exécuté par un microcontrôleur µC (« micro-Controller » en anglais). L’invention vise aussi des supports d'information ou d’enregistrement lisibles par un ordinateur, et comportant des instructions du programme d'ordinateur tel que mentionné ci-dessus. Les supports d'information ou d’enregistrement peuvent être n'importe quelle entité ou dispositif capable de stocker les programmes. Par exemple, les supports peuvent comporter un moyen de stockage, tel qu'une ROM, par exemple un CD ROM ou une ROM de circuit microélectronique, ou encore un moyen d'enregistrement magnétique, par exemple une disquette (floppy disk) ou un disque dur, ou une mémoire flash. D'autre part, les supports d'information ou d’enregistrement peuvent être des supports transmissibles tels qu'un signal électrique ou optique, qui peut être acheminé via un câble électrique ou optique, par lien radio, par lien optique sans fil ou par d'autres moyens. Le programme selon l'invention peut être en particulier téléchargé sur un réseau de type Internet. Alternativement, chaque support d'informations ou d’enregistrement peut être un circuit intégré dans lequel le programme est incorporé, le circuit étant adapté pour exécuter ou pour être utilisé dans l'exécution du procédé de génération et d’installation selon l’invention. D’autres caractéristiques et avantages de la présente invention ressortiront de la description faite ci-dessous, en référence aux dessins annexés qui en illustrent un exemple de réalisation dépourvu de tout caractère limitatif. Sur les figures : La figure 1 illustre une architecture fonctionnelle d'un dispositif de génération et d'installation d’un code exécutable conforme à l'invention, selon un mode de réalisation de l'invention ; La figure 2 est un organigramme représentant des étapes d’un procédé de génération et d'installation d’un code exécutable conforme à l'invention, mis en œuvre selon un mode de réalisation ; La figure 3 est un organigramme représentant des étapes supplémentaires d’un procédé de génération et d'installation d’un code exécutable conforme à l'invention, mis en œuvre selon un premier mode de réalisation de l’invention ; La figure 4A illustre une architecture de l'organisation de la mémoire d'une machine virtuelle avant la mise en œuvre du procédé de génération et d'installation d’un code exécutable conforme à l'invention, selon le mode de réalisation de la figure 3 ; La figure 4B illustre une architecture de l'organisation de la mémoire d'une machine virtuelle suite à la mise en œuvre du procédé de génération et d'installation d’un code exécutable conforme à l'invention, selon le mode de réalisation de la figure 3 ; La figure 4C illustre une architecture de l'organisation de la mémoire d'une machine virtuelle suite à la mise en œuvre du procédé de génération et d'installation d’un code exécutable conforme à l'invention, selon une variante du mode de réalisation de la figure 3 ; La figure 5 est un organigramme représentant des étapes supplémentaires d’un procédé de génération et d'installation d’un code exécutable conforme à l'invention, mis en œuvre selon un deuxième mode de réalisation de l’invention ; La figure 6A illustre une architecture de l'organisation de la mémoire d'une machine virtuelle suite à la mise en œuvre du procédé de génération et d'installation d’un code exécutable conforme à l'invention, selon le mode de réalisation de la figure 5 ; La figure 6B illustre une architecture de l'organisation de la mémoire d'une machine virtuelle suite à la mise en œuvre du procédé de génération et d'installation d’un code exécutable conforme à l'invention, selon une variante du mode de réalisation de la figure 5 ; La figure 7 est un organigramme représentant des étapes d’un procédé de génération et d'installation d'un code supplémentaire conforme à l'invention, mis en œuvre selon un mode de réalisation de l’invention ; La figure 8 illustre une architecture de l'organisation de la mémoire d'une machine virtuelle suite à la mise en œuvre du procédé de génération et d'installation conforme à l'invention, selon le mode de réalisation de la figure 7 ; La figure 9 illustre un mode particulier de réalisation de l’invention dans lequel les instructions déplacées comportent des instructions de branchement ou d’appel avec décalage d’adresse ; et La figure 10 illustre l’architecture matérielle d’un dispositif de génération et d'installation selon un mode de réalisation de l’invention. Description détaillée des modes de réalisation de l’invention La figure 1 illustre une architecture fonctionnelle d'un dispositif de génération et d’installation CMP conforme à un mode de réalisation de l'invention. Ce dispositif est configuré pour mettre en œuvre d’un procédé conforme à l'invention. Le dispositif d’installation CMP comporte une machine physique PHY, tel qu’un ordinateur, sur laquelle un hyperviseur H est installé. L’hyperviseur H est adapté pour gérer l’allocation des ressources physiques du serveur entre différentes instances de machines virtuelles et pour pouvoir créer, instancier, libérer et placer des machines virtuelles MV, MV’ et MV’’. Les machines virtuelles peuvent utiliser différents systèmes d’exploitation. Chacun des systèmes d’exploitation des machines virtuelles comporte au moins un noyau (en anglais « kernel »). On note par exemple K, le noyau de la machine virtuelle MV, plus précisément du système d’exploitation de la machine virtuelle MV. Plusieurs machines virtuelles peuvent être instanciées par l'hyperviseur H. L’hyperviseur H peut installer des codes exécutables dans une ou plusieurs de ces machines virtuelles, de façon personnalisée pour chacune de ces machines virtuelles. Dans cette description, et pour des raisons de simplification, nous décrivons des modes de réalisation dans lesquels l’hyperviseur H installe un ou plusieurs codes exécutables dans une seule machine virtuelle MV. La figure 2 est un organigramme représentant les différentes étapes d’un procédé de génération et d’installation d’un code exécutable CX1, appelé habituellement « sonde », d’au moins une fonction f1 dans le noyau d’une machine virtuelle, conformément à un mode de réalisation de l'invention. Ce procédé est mis en œuvre par l’hyperviseur H de la figure 1. Au cours d'une étape E001, l’hyperviseur H obtient le code source CS1 d’une sonde comprenant au moins le code source d’une fonction f1. Ce code CS1 peut comporter plusieurs fonctions et données internes à la sonde, et référencer d’autres fonctions, et/ou données externes à la sonde qui appartiennent donc à la machine virtuelle. L’hyperviseur H est configuré pour installer le code exécutable CX1 de la sonde, obtenu à partir de ce code source CS1, dans le noyau K de la machine virtuelle MV, ce code CX1 étant spécifique à cette machine virtuelle. A cet effet, au cours d’une étape E010, l’hyperviseur H obtient des données de configuration CFG_MV de la machine virtuelle MV, ces données de configuration comportant au moins une adresse @F d’une fonction F appelée par le code source CS1 dans la mémoire de la machine virtuelle MV, ou une adresse @D d’une donnée D référencée par le code source CS1 dans la mémoire de la machine virtuelle MV. A titre d’exemple, lorsque le dispositif CMP utilise un système d’exploitation de type Linux, les données de configuration CFG_MV peuvent être comprises dans un fichier de type « system.map », comprenant une liste exhaustive des fonctions du système d’exploitation de la machine virtuelle MV ainsi que, pour chacune de ces fonctions (F), l’adresse mémoire (@F) de l’espace mémoire dans lequel cette fonction est enregistrée. Les données de configuration CFG_MV peuvent comprendre une information sur la structure des données enregistrées dans la machine virtuelle MV, par exemple sur la façon dont un descripteur de processus est structuré : identifiant du processus, processus suivant, précédent, etc. Au cours d’une étape E020, l’hyperviseur H compile le code source CS1 en utilisant les données de configuration CFG_MV pour obtenir un code objet. Au cours d’une étape E030, l’hyperviseur H appelle une fonction malloc_MV de la machine virtuelle MV pour allouer un espace mémoire EM1 dans la mémoire du noyau de la machine virtuelle MV au moins suffisant pour accueillir le code exécutable CX1. On note @EM1 l’adresse de début de cet espace mémoire EM1 dans la machine virtuelle VM. L’hyperviseur H édite ensuite les liens (en anglais « link ») et assemble le code objet pour obtenir le code exécutable CX1 en utilisant les données de configuration CFG_MV et un résultat de l’appel (E030) à la fonction malloc_MV, notamment l’adresse @EM1 de l’espace EM1. Ainsi, le code exécutable CX1 est spécifique à la machine virtuelle MV ; en effet, l’édition de liens repose sur la configuration de la machine virtuelle MV. Au cours d’une étape E040, l’hyperviseur H enregistre le code exécutable CX1 dans la machine virtuelle MV, dans l’espace mémoire EM1 alloué à l’étape E030. La figure 3 est un organigramme représentant des étapes supplémentaires du procédé de génération et d’installation selon l’invention, ces étapes étant mises en œuvre par l’hyperviseur H, conformément à un mode particulier de réalisation de l'invention. Ces étapes supplémentaires visent à permettre l’appel du code exécutable CX1 de la fonction f1, c’est-à-dire l’appel de la sonde, par un code exécutable CX0 d’une autre fonction f0, ce code exécutable CX0 étant installé dans un espace EM0 de la mémoire du noyau la machine virtuelle MV, conformément à la description faite en relation avec la figure 2. Le code exécutable CX0 de la fonction sondée f0 peut être une fonction préexistante dans le noyau de la machine virtuelle MV. Par exemple, ce code CX0 peut être le code d’une fonction f0 de lecture de fichier depuis un disque. Ce procédé est mis en œuvre par l’hyperviseur H de la figure 1. La figure 4A représente la mémoire de la machine virtuelle VM avant l’exécution des étapes de la figure 3 : - le code CX0 démarre à l’adresse @EM0 du début de l’espace mémoire EM0 ; - le code CX0 comporte des instructions INS0 consécutives dans la fonction f0 ; - l’adresse de la mémoire virtuelle suivant ces instructions INS0 est notée @EM0+ ; - le code CX1 démarre à l’adresse @EM1 ; - le code CX1 se termine par une instruction de retour RET, l’adresse de cette instruction étant notée @RET1. Au cours d’une étape E045, l’hyperviseur H repère dans la mémoire du noyau de la machine virtuelle MV l’adresse @RET1 de la dernière instruction de retour (de type RET ou return) du code CX1 de la fonction f1. On entend par dernière instruction de retour, l’instruction de retour dont l’adresse est la plus grande. Au cours d’une étape E050, l’hyperviseur H déplace une ou plusieurs instructions consécutives INS0 se trouvant à l’adresse @EM0 du code CX0 à l’adresse @RET1, écrasant ainsi l’instruction de retour de la fonction f1. Les instructions INS0 du code CX0 sont destinées à être exécutées à la place de l’instruction de retour RET du code CX1. L’instruction ou les instructions déplacées INS0 peuvent être enregistrées exactement à l’adresse @RET1. En variante, une ou plusieurs instructions de type NOP sont enregistrées à l’adresse @RET1 et les instructions déplacées INS0 sont enregistrées après ces instructions NOP. On rappelle que les instructions NOP (en anglais No Operation) sont des instructions nulles qui dictent au processeur de n’effectuer aucune action. Au cours d’une étape E060, l’hyperviseur H enregistre dans la mémoire du noyau de la machine virtuelle MV, juste après les instructions INS0 déplacées, une instruction JMP @EM0+ de branchement à l’adresse @EM0+ qui suivait l’adresse @EM0 des instructions INS0 dans le code CX0 avant leur déplacement. Au cours d’une étape E070, l’hyperviseur H remplace dans le code CX0, la ou les instructions INS0 par une instruction JMP @EM1 de branchement à l’adresse @EM1 du début de l’espace mémoire EM1 où est enregistré le code CX1. Ainsi le code CX1 de la fonction f1, installé par l’hyperviseur, est exécuté avant l’exécution du code CX0 de la fonction f0. La figure 4B illustre le contenu de la mémoire de la machine virtuelle MV suite à la mise en œuvre par l’hyperviseur H du procédé d’installation décrit en référence aux figures 1 à 4A. Suite à la mise en œuvre du procédé de l’invention, lorsque la machine virtuelle MV commence à exécuter le code exécutable CX0 de la fonction f0 (phase 1 de la figure 4B), le processeur du dispositif CMP exécute l’instruction JMP @EM1 et se branche au début du code exécutable de la fonction f1 (phase 2). Le processeur exécute, au cours d’une phase 3, le code CX1 de la fonction f1 sauf l’instruction de retour RET, écrasée, puis les instructions INS0 déplacées, puis il se branche à l’adresse @EM0+ (phase 5) ; il exécute la fin du code CX0 (phase 6). L’invention permet ainsi d’enrichir le code CX0 par le code CX1 de la fonction f1. Dans ce mode de réalisation, au cours de l’étape E030 d’appel à la fonction d’allocation de mémoire malloc_MV, l’hyperviseur H réserve de la place non seulement pour le code exécutable CX1, mais aussi pour l'instruction de branchement JMP @EM0+. Dans un autre exemple de ce mode de réalisation représenté à la figure 4C , l’hyperviseur H déplace une ou plusieurs instructions consécutives INS0 se trouvant à l’adresse @EM0 du code CX0 avant le code CX1, autrement dit à une adresse @EM1- précédant l’espace mémoire EM1. Dans l’exemple de la figure 4C, l’hyperviseur enregistre, à l’adresse @RET1 de la dernière instruction de retour du code CX1, une instruction JMP @EM0+ de branchement à l’adresse @EM0+ qui suivait l’adresse @EM0 des instructions INS0 dans le code CX0 avant leur déplacement. L’hyperviseur remplace ensuite dans le code CX0, la ou les instructions déplacées INS0 par une instruction de branchement à l’adresse @EM1- précédant l’espace mémoire EM1 du premier code CX1, autrement dit à l’adresse où les instructions ont été déplacées. Cet exemple est particulièrement intéressant lorsque l’on veut sonder le retour d’une fonction depuis une fonction appelante. En variante, une ou plusieurs instructions de type NOP sont enregistrées à l’adresse @RET1, et l’hyperviseur H enregistre l’instruction JMP @EM0+ dans la mémoire du noyau de la machine virtuelle MV, juste après le code CX1. La figure 5 est un organigramme représentant des étapes supplémentaires du procédé de génération et d’installation selon l’invention, mis en œuvre par l’hyperviseur H conformément à un autre mode de réalisation de l'invention. Les étapes supplémentaires visent à permettre l’appel du code exécutable CX1 par un code exécutable CX0 installé dans la mémoire du noyau de la machine virtuelle, en utilisant un espace mémoire supplémentaire AGR, dit d’agrégation. La mémoire de la machine virtuelle MV avant l’exécution des étapes de la figure 5 est identique à celle de la figure 4A déjà décrite. Au cours d’une étape E0500, l’hyperviseur H initialise la mémoire d’agrégation AGR, par exemple en lui allouant une page mémoire et en la remplissant par des instructions nulles de type NOP. Au cours d’une étape E052, l’hyperviseur H déplace, à la fin de l’espace d’agrégation AGR : - une ou plusieurs instructions INS0 du code CX0 ; - suivies par une instruction JMP @EM0+ de branchement à l’adresse @EM0+ qui suivait les instructions INS0 dans le code CX0 avant leur déplacement. Au cours d’une étape E064, l’hyperviseur H enregistre au début de l’espace d’agrégation AGR, une instruction de branchement JMP @EM1 à l’adresse de l’espace mémoire EM1 du code CX1. Au cours d’une étape E066, l’hyperviseur H remplace à l’adresse @RET1 une dernière instruction de retour du code CX1 par une instruction de branchement JMP @AGR+ à une adresse @AGR+ dans l’espace mémoire d’agrégation AGR consécutive à celle de l’instruction de branchement JMP @EM1. Au cours d’une étape E072, l’hyperviseur H remplace dans le code CX0, la ou les instructions déplacées INS0 par une instruction JMP @AGR de branchement à l’adresse de la mémoire d’agrégation AGR. La figure 6A illustre la mémoire de la machine virtuelle MV suite à la mise en œuvre par l’hyperviseur H du procédé d’installation selon le mode décrit en référence à la figure 5. La figure 6A montre des espaces mémoire dans lesquels sont enregistrés le code CX0, le code CX1, et l’espace d’agrégation AGR. Dans l’espace mémoire du code CX0, les instructions déplacées INS0 sont remplacées par l’instruction JMP @AGR de branchement à l’espace d’agrégation AGR. Dans l’espace mémoire EM1 correspondant au code CX1, se trouve le code CX1 privé de l’instruction de retour RET, suivi directement ou après des instructions de type NOP, de l’instruction JMP @AGR+ de branchement à une instruction NOP de l’espace d’agrégation AGR. Dans l’espace d’agrégation AGR, se trouve l’instruction JMP @EM1 de branchement à l’espace mémoire EM1 du code CX1, suivie d’instructions NOP, suivies de la ou des instructions déplacées INS0, puis de l’instruction JMP @EM0+ de branchement vers l’adresse @EM0+ qui suivait les instructions INS0 dans le code CX0 avant leur déplacement. Suite à la mise en œuvre du mode de réalisation de la figure 6A, lorsque la machine virtuelle MV commence à exécuter le code CX0 (phase 1), le processeur se branche au début de la mémoire d’agrégation AGR, et exécute les premières instructions de l’espace d’agrégation AGR. Ce branchement est illustré par la phase 2 de la figure 6A. Le processeur se branche alors au début du code CX1 (phase 3) et il commence l’exécution de ce code CX1 (phase 4). Le processeur se branche alors à l’adresse @AGR+ de la mémoire d’agrégation (phase 5). Le processeur exécute alors des instructions NOP (phase 6) puis les instructions déplacées INS0. Ensuite, le processeur se branche à l’adresse @EM0+ du code CX0 (phase 7) puis termine l’exécution du code CX0 de la fonction f0 (phase 8). La fonction f0 est ainsi enrichie par la fonction f1. Dans un autre exemple de ce mode de réalisation représenté sur la figure 6B , l’hyperviseur H déplace au début de (ou avant) l’espace mémoire d’agrégation AGR une ou plusieurs instructions INS0 du code CX0. Puis il enregistre, après l’instruction INS0 de l’espace mémoire d’agrégation, une première instruction JMP @EM1 de branchement à l’espace mémoire de la fonction CX1, et enregistre à la fin de l’espace mémoire d’agrégation AGR une instruction JMP@EM0+ de branchement à l’adresse @EM0+ qui suivait les instructions INS0 dans le code CX0 avant leur déplacement. L’hyperviseur H remplace la dernière instruction de retour du code CX1 par une instruction de branchement à une adresse @AGR+ immédiatement consécutive à celle de la première instruction de branchement. L’hyperviseur H remplace dans le code CX0, la ou les instructions déplacées INS0 par une instruction JMP @INS0 de branchement à la ou les instructions déplacées INS0, après leur déplacement. Cet exemple de réalisation est particulièrement intéressant lorsque l’on veut sonder le retour d’une fonction depuis une fonction appelante. Dans cet exemple, l'instruction de branchement JMP @EM0+ est placée à la fin de l'espace d'agrégation AGR, séparée de la première instruction JMP @EM1 par des instructions vides de type NOP. De cette façon, ces instructions intermédiaires NOP peuvent être remplacées par des instructions de branchement à d’autres codes supplémentaires pour enrichir le code CX0 par ces codes supplémentaires en plus du code CX1, tel que décrit ci-après en référence à la figure 7. Alternativement, lorsqu’il n’y a pas de codes supplémentaires, l'instruction de branchement JMP @EM0+ peut suivre la première instruction JMP @EM1 directement. La figure 7 est un organigramme représentant les différentes étapes d’un procédé de génération et d’installation, dans le noyau K d’une machine virtuelle MV, d’au moins un code exécutable supplémentaire CX2, conformément à un mode de réalisation de l'invention. Ce procédé est mis en œuvre par l’hyperviseur H. Dans ce mode de réalisation, nous supposons qu’un code CX0 est installé dans la mémoire de la machine virtuelle MV et qu’un code CX1 a été également installé dans le noyau K de la machine virtuelle MV selon le mode décrit en référence aux figures 5 et 6A (ou 6B). Les étapes suivantes visent à installer un autre code exécutable CX2 dans la mémoire du noyau K et à pouvoir l'exécuter à partir du code CX0, après l’exécution du code CX1, en utilisant la mémoire d’agrégation AGR. Au cours d’une étape E067, l’hyperviseur H enregistre, dans la mémoire d’agrégation AGR, après l’instruction JMP @EM1 de branchement à l’espace mémoire occupé par le code CX1, une instruction JMP @EM2 de branchement à l’espace mémoire EM2 occupé par le code CX2. Au cours d’une étape E068, l’hyperviseur H remplace une instruction de retour du code CX2 par une instruction de branchement JMP @AGR++ à une adresse de la mémoire d’agrégation AGR consécutive à celle de l’instruction JMP @EM2 de branchement à l’espace mémoire EM2. L’invention permet ainsi d’enrichir le code CX0 par les codes exécutables CX1 et CX2. D’autres codes exécutables supplémentaires CXi peuvent être installés et enrichir la fonction CX0 en utilisant l’espace d’agrégation AGR, selon le mode de réalisation décrit en référence à la figure 7. La figure 8 illustre une architecture d’organisation de la mémoire dans la machine virtuelle MV suite à la mise en œuvre par l’hyperviseur H du procédé d’installation selon le mode décrit en référence à la figure 7. Dans un exemple de réalisation décrit en référence à la figure 9 , les instructions déplacées INS0 comprennent une ou plusieurs instructions de branchement, par exemple JMP, CALL, etc. De telles instructions comprennent un déplacement en mémoire (« offset ») pour référencer la destination du branchement. Dans l’exemple de la figure 9, les instructions INS0, enregistrées à l’adresse 0100, de 50 octets, comportent une instruction de branchement avec un offset de 80 octets (JMP OFF 80) pointant vers l’adresse 0180. Lorsque les instructions INS0 qui comprennent de tels branchements sont déplacées, la destination des branchements n’est plus la même que celle initialement prévue. En effet, du fait du déplacement des instructions INS0, la destination des branchements change, puisqu’elle est calculée en fonction de l’adresse de l’instruction de branchement. On suppose ici que les instructions INS0 sont déplacées à l’adresse 0300. Afin de pallier à cet inconvénient, il est prévu d’ajouter avant ou après les instructions déplacées INS0 autant d’instructions ILI de branchements longs inconditionnels qu’il y a d’instructions de branchement ou d’appels dans les instructions déplacées INS0. Chacune des instructions de branchement long inconditionnel ajoutée pointe vers une destination cible @CIB pointée par une instruction de branchement d’origine INSOR comprise dans les instructions déplacées INS0, avant leur déplacement. Dans l’exemple décrit ici, on enregistre à l’adresse 0350, correspondant à la fin des instructions déplacées une instruction de branchement long inconditionnel JMP OFF -170 pointant vers l’adresse cible 0180. Une instruction de branchement comprise dans les instructions déplacées INS0 est modifiée de manière à pointer vers l’instruction de branchement ajoutée ILI, qui pointe vers la destination initiale @CIB (0180) prévue avant le déplacement des instructions INS0. Dans l’exemple décrit ici, l’instruction de branchement JMP OFF 80 déplacée à l’adresse 300 est modifiée par une instruction de même type JMP OFF 50 pointant vers l’adresse 0350 où est enregistrée l’instruction de branchement inconditionnel ILI. Dans un premier cas correspondant à l’exemple de la figure 9, les instructions de branchement inconditionnel (JMP OFF -170) sont ajoutées après l’instruction de branchement JMP EM0+ lorsque les instructions déplacées INS0 se trouvent après le code exécutable CX1 ou après l’espace mémoire agrégateur AGR. De cette façon, même si l'instruction INSOR est de type instruction de branchement conditionnel et si les conditions correspondantes ne sont pas vérifiées, la suite de l'exécution reste valide car le branchement indiqué dans l'instruction INSOR ne sera pas effectué et l'instruction de branchement JMP EM0+ permet à la machine virtuelle MV d'exécuter la suite du premier code CX0. Dans un deuxième cas, les instructions de branchement sont ajoutées avant les instructions déplacées INS0 lorsque celles-ci se trouvent avant le code exécutable CX1 ou avant l’espace mémoire agrégateur AGR. Les procédés de la présente invention ont été expérimentés par une mise en œuvre sur des machines virtuelles MV qui utilisent le système d’opération Linux, Debian version 7, et/ou Windows, version 7 (marques déposées). D’autres versions de ces systèmes sont envisageables. En outre, d’autres systèmes d’exploitation sont envisageables, tels que les systèmes FreeBSD, NetBSD, et OpenBSD (marques déposées). Dans les modes de réalisation décrits ici, le dispositif d’installation CMP a l’architecture d’un ordinateur, telle qu’illustrée à la figure 10 . Elle comprend notamment un processeur 7, une mémoire vive 8, une mémoire morte 9, une mémoire flash non volatile 10 dans un mode particulier de réalisation de l’invention, ainsi que des moyens de communication 11. De tels moyens sont connus en soi et ne sont pas décrits plus en détail ici. La mémoire morte 9 de dispositif CMP selon l’invention constitue un support d’enregistrement conforme à l’invention, lisible par le processeur 7 et sur lequel est enregistré l’hyperviseur H conforme à l’invention. La mémoire 10 de dispositif CMP permet d’enregistrer des variables utilisées pour l’exécution des étapes des procédés de l’invention, telles que les données de configuration CFG_MV, le code source CS, etc. L’hyperviseur H définit des modules fonctionnels et logiciels, configurés pour installer un code exécutable dans un noyau K d’une machine virtuelle MV. Ces modules fonctionnels s’appuient sur et/ou commandent les éléments matériels 7-11 du dispositif CMP cités précédemment. Dans les modes de réalisations décrits, l’hyperviseur H met en œuvre l’invention. Dans un autre exemple de réalisation, certaines étapes de l’invention peuvent être mises en œuvre dans un logiciel externe, i.e. externe à l’hyperviseur, et d’autres mises en œuvre par l’hyperviseur. Par exemple, la génération du code exécutable à partir du code source et des données de configuration peut être mise en œuvre par le logiciel externe et l’installation du code exécutable dans la mémoire de la machine virtuelle peut être mise en œuvre par l’hyperviseur. Procédé de génération et d’installation d’un code exécutable (CX1, CX2) d’au moins une première fonction (f1) dans la mémoire d’un noyau (K) d’une machine virtuelle (MV), ledit procédé étant mis en œuvre par un hyperviseur (H), et comprenant des étapes de : - obtention (E001) d’un code source (CS1) comprenant au moins la première fonction (f1) ; - obtention (E010) de données de configuration (CFG_MV) de ladite machine virtuelle, lesdites données de configuration comportant au moins une adresse (@F, @D) dans une mémoire du noyau de la machine virtuelle (MV) d’une fonction ou de données référencées par ledit code source (CS1) ; - obtention (E020) d’un code objet par compilation dudit code source (CS1) en utilisant lesdites données de configuration (CFG_MV) ; - appel (E030) d’une fonction d’allocation de mémoire (malloc_MV) de ladite machine virtuelle, pour réserver un espace (EM1) dans la mémoire du noyau de la machine virtuelle (MV) pour un code exécutable (CX1) correspondant audit code objet ; - obtention dudit code exécutable (CX1) par assemblage dudit code objet en utilisant lesdites données de configuration (CFG_MV) et un résultat (@EM1) dudit appel (E030) à la fonction d’allocation de mémoire ; et - enregistrement (E040) dudit code exécutable (CX1) dans ledit espace mémoire (EM). Procédé de génération et d’installation d’un code exécutable (CX1) selon la revendication 1, ce procédé comportant en outre des étapes de : - obtention (E045) de l’adresse (@RET1) d’une dernière instruction de retour dudit code exécutable (CX1) ; - déplacement (E050) à ladite adresse (@RET1), d’au moins une instruction (INS0) d’un deuxième code exécutable (CX0) installé dans la mémoire du noyau de ladite machine virtuelle ; - enregistrement (E060) dans une adresse de ladite mémoire, après ladite au moins une instruction déplacée (INS0), d’une instruction de branchement à une adresse (@EM0+) consécutive à l’adresse (@EM0) des instructions (INS0) dans ledit deuxième code (CX0) avant leur déplacement ; et - remplacement (E070) dans ledit deuxième code (CX0), de ladite au moins une instruction déplacée (INS0) par une instruction de branchement audit espace mémoire (EM1) dudit code exécutable (CX1). Procédé de génération et d’installation d’un code exécutable (CX1) selon la revendication 1, ce procédé comportant en outre des étapes de : - déplacement, à une adresse (@EM1-) précédant l’espace mémoire (EM1) dudit code exécutable (CX1), d’au moins une instruction (INS0) d’un deuxième code exécutable (CX0) installé dans la mémoire du noyau de ladite machine virtuelle, ; - enregistrement à une adresse (@RET1) d’une dernière instruction de retour dudit code exécutable (CX1), d’une instruction de branchement à une adresse (@EM0+) qui suivait l’adresse (@EM0) des instructions (INS0) dans le deuxième code (CX0) avant leur déplacement ; et - remplacement dans ledit deuxième code (CX0), de ladite au moins une instruction déplacée(INS0) par une instruction de branchement à ladite adresse (@EM1-) précédant l’espace mémoire (EM1). Procédé de génération et d’installation d’un code exécutable (CX1) selon la revendication 1 comportant en outre des étapes de : - déplacement (E052) dans un espace mémoire dit d’agrégation (AGR), d’au moins une instruction (INS0) d’un deuxième code exécutable (CX0) installé dans une mémoire du noyau ladite machine virtuelle, ces instructions étant suivies par une instruction de branchement à une adresse (@EM0+) qui suivait lesdites instructions (INS0) dans ledit deuxième code (CX0) avant leur déplacement ; - enregistrement (E064) dans ledit espace mémoire d’agrégation (AGR), avant ladite au moins une instruction déplacée (INS0), d’une première instruction de branchement audit espace mémoire (EM1) dudit code (CX1) exécutable ; - remplacement (E066) d’une dernière instruction de retour dudit code (CX1) par une deuxième instruction de branchement à une adresse (@AGR+) dans ledit espace mémoire d’agrégation, consécutive à celle de ladite première instruction de branchement ; et - remplacement (E072) dans ledit deuxième code (CX0), de ladite au moins une instruction déplacée (INS0) par une instruction de branchement audit espace mémoire d’agrégation (AGR). Procédé de génération et d’installation d’un code exécutable (CX1) selon la revendication 1 comportant en outre des étapes de : - déplacement dans un espace mémoire dit d’agrégation (AGR), d’au moins une instruction (INS0) d’un deuxième code exécutable (CX0) installé dans une mémoire du noyau ladite machine virtuelle ; - enregistrement, dans ledit espace mémoire d’agrégation (AGR), d’une première instruction de branchement audit espace mémoire (EM1) dudit code (CX1) suivie par une instruction de branchement à une adresse (@EM0+) qui suivait lesdites instructions (INS0) dans ledit deuxième code (CX0) avant leur déplacement ; - remplacement d’une dernière instruction de retour dudit code (CX1) par une deuxième instruction de branchement à une adresse (@AGR+) dans ledit espace mémoire d’agrégation, immédiatement consécutive à celle de ladite première instruction de branchement ; et - remplacement dans ledit deuxième code (CX0), de ladite au moins une instruction déplacée(INS0) par une instruction de branchement à l’adresse de ladite au moins une instruction déplacée (INS0) dans ledit espace d’agrégation (AGR). Procédé de génération et d’installation d’un code exécutable (CX1) selon l’une des revendications 2 à 5 dans lequel ladite étape (E030) d’appel de la fonction d’allocation de mémoire prend en considération la taille d’une dite instruction de branchement en plus de la taille dudit code exécutable (CX1). Procédé de génération et d’installation d’un code exécutable (CX1) selon l’une quelconque des revendication 4 à 6, pour installer au moins un code exécutable supplémentaire (CX2) dans la mémoire du noyau (K) de ladite machine virtuelle (MV), ledit procédé comportant des étapes de : - enregistrement (E067) dans ledit espace mémoire d’agrégation (AGR), après ladite instruction de branchement à l’espace mémoire du code exécutable (CX1), d’une troisième instruction de branchement à un espace mémoire (EM2) du code exécutable supplémentaire (CX2) ; et - remplacement (E068) d’une instruction de retour dudit code supplémentaire (CX2) par une instruction de branchement à une adresse (@AGR++) dudit espace mémoire d’agrégation, consécutive à celle de ladite troisième instruction de branchement. Procédé de génération et d’installation d’un code exécutable (CX1) selon l’une quelconque des revendications 2 à 7 dans lequel ladite au moins une instruction déplacée (INS0) comporte au moins une instruction d’origine de branchement ou d’appel avec un décalage d’adresse vers une adresse cible, ledit procédé comportant des étapes de : - enregistrement, dans une zone (Z) atteignable par une instruction du type de ladite instruction d’origine dans la mémoire du noyau de la machine virtuelle, d’une instruction de branchement long inconditionnel à l’adresse cible ; et - modification de ladite instruction d’origine par une instruction modifiée de même type pointant vers ladite instruction de branchement long inconditionnel. Dispositif de génération et d’installation d’un code exécutable (CX1) d’au moins une première fonction dans une mémoire d’un noyau (K) d’une machine virtuelle (MV), ledit dispositif comportant la machine virtuelle et un hyperviseur (H), ledit hyperviseur comportant un module (MOD) apte à mettre en œuvre un procédé de génération et d’installation d’un code exécutable (CX1) selon l’une des revendications 1 à 8. Programme d’ordinateur (Prog) comportant des instructions pour l’exécution d’un procédé de génération et d’installation d’un code exécutable (CX1) selon l’une des revendications 1 à 8 lorsque ledit programme est exécuté par un ordinateur. Support d’enregistrement lisible par un ordinateur sur lequel est enregistré le programme d’ordinateur (Prog) selon la revendication 10.