Gestionnaire de mémoire virtuelleLe gestionnaire de mémoire virtuelle est un circuit électronique (MMU) qui permet de réaliser le mécanisme de la mémoire virtuelle, à savoir la translation des adresses virtuelles en adresses physiques. Le concept de mémoire virtuelle est assez ancien, il a été implémenté dans les années 1960 et il est toujours très utilisé. Son but est d'augmenter la taille de la mémoire utilisable, de mettre en place des mécanismes de protection et de faciliter l'allocation de la mémoire utilisée par un processus en simplifiant le travail des développeurs. L'origine de cette découverte est la différenciation entre l'espace d'adressage virtuel et l'espace d'adressage physique. Même si les mécanismes mis en jeu rendent de grands services, ils ont un coût en matière de performance, celle-ci est un enjeu important actuellement ; les internautes sont très sensibilisés aux temps de réponse. Le paradoxe est le suivant : Les applications sont de plus en plus complexes et demandeuses de mémoire toutefois, les utilisateurs sont de plus en plus exigeants en ce qui concerne la performance. L'autre défi majeur relevé par la mémoire virtuelle, c'est la protection de la mémoire. De fait, une étanchéité entre les différents programmes doit être assurée. Le problème actuel est de garantir cette sécurité face aux différentes attaques (attaques par relais, par codes arbitraires). Le concept de Mémoire Virtuelle est en constante évolution, il est remis en cause dans certains types d'architectures tels que : Les Big Memory Server (en) ou les Systèmes Big Data car trop coûteux en temps. GénéralitésDéfinitionsPrincipe de base : toutes les informations d’un programme ne peuvent être référencées par le processeur que lorsqu’elles se trouvent en Mémoire centrale. L’information qui a besoin d’être référencée rapidement doit résider en mémoire centrale et toutes les autres informations doivent être en mémoire auxiliaire (mémoire de masse). Il serait trop couteux en ressource de charger l'intégralité des programmes exécutés par un ordinateur en mémoire, c'est une des raisons pour lesquelles le procédé de mémoire virtuelle a été mis au point à la fin des années 1950[1],[2]. Les mémoiresLa mémoire physique correspond à la mémoire physiquement installée, c'est-à-dire principalement à la mémoire vive dynamique, la RAM[3]. Il s'agit d'une zone de stockage temporaire, une mémoire de travail, dans laquelle sont chargés les données et les programmes[4],[5] qui seront traitées par le processeur. On utilise également d'autres dispositifs, tels que les disques durs, les disques SSD comme espace d'échange (zone de swap). Une hiérarchie des mémoires s'établit suivant les principales caractéristiques qui sont : le temps d'accès, la persistance des données, l'espace d'adressage. Les mémoires vives (RAM) sont dites volatiles et possèdent un temps d'accès aux données de quelques dizaines de nanosecondes, et les mémoires comme celle du disque dur ont des accès plus lents : quelques millisecondes, on les appelle aussi Mémoire de masse[6]. Espace d'adressage![]() L'espace adressable par le processeur se distingue de l'espace réellement adressable dans la mémoire physique :
Un processus pour qu'il puisse s'exécuter doit être chargé en mémoire centrale. Si plusieurs programmes sont concurrents, il est nécessaire :
Les mécanismes de la mémoire virtuelle permettent de répondre à ces deux besoins principaux. Mécanisme matériel de la mémoire virtuelleUnité de Gestion MémoireLa MMU (Memory Management Unit ou PMMU Paged Memory Management Unit) est le circuit électronique qui rend possible la mémoire virtuelle, c'est par son intermédiaire que seront converties (en anglais mapping) les adresses mémoires virtuelles en adresses physiques[10],[11]. TLB (Translation Lookaside Buffer)![]() Pour améliorer le temps d'accès à la mémoire, un ensemble de registres attachés à la MMU, met en œuvre une mémoire cache : TLB (Translation Lookaside Buffer)[12],[11],[13]. Le TLB mémorise les dernières correspondances entre les adresses virtuelles et les adresses physiques pages, cadres utilisées par un processus. Cette mémoire cache contient les numéros de page ainsi que l'adresse de la case contenant la plus récemment accédée. La MMU cherche en premier lieu dans le cache s'il existe une déjà une correspondance entre la page et l'adresse d’implantation de la case[14]. La paginationPrincipe de la paginationLes données sont organisées dans la mémoire virtuelle sous forme de pages ou de segments, il y a aussi un autre mode d'organisation qui combine les deux. Dans la mémoire physique elles sont organisées sous forme de cadres, une page correspond à un cadre. Donc quand un programme a besoin d'être chargé en mémoire centrale, il faut donc placer les pages dans n’importe quelle case (ou cadre) disponible. La correspondance entre les pages de la mémoire virtuelle et les cases de la mémoire centrale se fait par la table de pages[15].
![]() La taille d'une page est en moyenne de 4Ko. Les adresses des données dans une page sont constituées d'un couple numéro de page et déplacement à partir du début de cette page. La MMU permet d'associer une adresse virtuelle à une adresse mémoire physique[16]. Elle reçoit en entrée une adresse virtuelle et vérifie qu'elle correspond bien à une adresse physique si c'est le cas, elle transmet l'information à la mémoire physique sinon il se produit ce qu'on appelle un défaut de page[17],[18]. S'il n'existe plus de cases mémoire disponibles en mémoire physique, la mémoire virtuelle peut combiner ces mécanismes avec le swapping, pour trouver de la disponibilité mémoire sur le disque[19],[20]. Il y a de nombreux mécanismes pour traduire les adresses virtuelles en adresses mémoire physiques, cela dépend de la manière dont sont stockées les données en mémoire : sous forme de pages de taille fixe, ou en segments de tailles variables ou en segments divisés en pages[21]. La MMU a aussi pour rôle de protéger le Système d'exploitation des accès non autorisés à des zones de la mémoire. Dans la table des pages, on trouve pour chaque entrée, un bit de validité qui indique s'il existe bien une page physique correspondant à la page virtuelle demandée, ainsi que des informations sur les droits d'accès en écriture ou en exécution, à l'accès autorisé en mode utilisateur ou non[22],[23]. Le mécanisme de conversion d'adresse s'effectue grâce à la table des pages. Dès qu'un processus est chargé en mémoire principale sa table de page est chargée aussi, son rôle est de conserver l'information suivante : les adresses de pages (numéro de page + numéro de déplacement dans la page) et les adresses de cadres correspondant à ce même processus, il faut noter qu'on se sert du numéro de page comme index dans la table des pages[24].
![]() Une fois l'adresse virtuelle générée par le processeur, on vérifie d'abord en mémoire cache TLB, s'il existe une correspondance entre la page et la case (TLB hit), l'adresse physique est directement accessible en mémoire centrale. Si aucune correspondance n'est trouvée (TLB miss), il faut alors se rendre dans la table de pages pour déterminer l'adresse physique[26],[13]. Une fois l'adresse physique déterminée, si le cadre de page existe, l'adresse physique est alors accessible en mémoire centrale. Si le cadre de page n'est pas trouvé en mémoire il se produit un défaut de page (page fault), il faut alors utiliser l'un des algorithmes de remplacement de page. Pagination 64 bitsUne adresse virtuelle est divisée en un numéro de page et un déplacement (Offset). Le numéro de page est ensuite lui-même divisé en une séquence d'index, chaque index pointant vers l'entrée de la table suivante et ainsi de suite jusqu'à la dernière table. Au fur et à mesure que la taille des adresses virtuelles augmente, le nombre de table de pages augmente également (Par exemple, il y a quatre niveaux de table pour un processeur AMD Opteron de façon à prendre en charge une adresse virtuelle 64 bits, voir ci-dessous). À chaque décennie, la profondeur du nombre de tables augmente d'un niveau[27],[28]. Illustration de la pagination en mode 64 bitsCi-dessous la répartition des tables de pages sur 4 niveaux pour les processeurs AMD et Intel[29],[30] : ![]()
Le registre CR3 est utilisé pour pointer vers l'adresse de base de la table de traduction de page du plus haut niveau. Une fois que cette adresse de base est trouvée, la MMU prend les bit 39 à 47 (total de 9 bits) comme un index dans la table de page PML4. La valeur dans cet index donne l'adresse de base de la page de la table PDP. De même, les prochains 9 bits (30 à 38) donnent l'index dans la table de page PDP qui donne l'adresse de base de la table de page d'entrée PD. De la même façon, on trouve l'index dans la table PD pour l'adresse de base de la table PT en utilisant les 9 bits suivants (21 à 29). Les 9 bits suivants (12 à 20) donnent l'index dans la table PTE qui donne l'adresse de base de la page physique réelle contenant les données et le code du processus[31]. Les 12 derniers bits correspondent au décalage (Offset) dans les 4Ko de la mémoire physique.
La mémoire virtuelle : Réponse à plusieurs besoinsComme l'indique Peter J. Denning (en) dans un article de 2008, la mémoire virtuelle répond à plusieurs besoins[32]. Principalement, elle permet :
Mémoire virtuelle et performancesÉvaluation de la performanceLa pagination peut affecter significativement la performance d'un ordinateur. D'après Silberschatz, si on définit[34]:
Quand il y a peu de défaut de pages, la probabilité d'un défaut de page tend vers :
Sinon : Comme décrit dans Thrashing : Its causes and prevention par Denning, lorsque le nombre de défaut de page augmente significativement, le système effectue des opérations d'écroulement ou thrashing entraînant inévitablement une réduction de la performance. Le traitement d'un grand nombre de défauts de page peut provoquer un effondrement du système quand le celui-ci passe plus de temps à traiter les défauts de page qu'à exécuter des processus[35]. Algorithmes de remplacement de pagesÀ la suite d'un défaut de page, le système doit ramener la page manquante en mémoire centrale ; s'il n'y a plus de place en mémoire il faut alors retirer une Page et la mettre en mémoire auxiliaire : le disque, par exemple. C'est ce mécanisme qu'on appelle le « remplacement de page ». Il existe de nombreux algorithmes de remplacement de page pour circonscrire ce phénomène d'écroulement[17]: Working setLe working set (en) permet d'estimer la quantité de mémoire qu'un processus requiert dans un intervalle de temps donné.Suivant ce modèle, un processus ne pourra être chargé en RAM que si et seulement si l'ensemble des pages qu'il utilise peut y être chargé. Dans le cas contraire, le processus est swappé de la mémoire principale vers la mémoire auxiliaire de façon à libérer de la mémoire pour les autres processus[36]. Algorithme de remplacement LRULeast Recently Used est l'algorithme le plus fréquemment utilisé : Toutes les pages en mémoire figurent dans une liste chainée, avec en tête de liste la plus récemment utilisée, quand le défaut de page survient , l'algorithme retire la page la moins récemment utilisée : celle qui est en queue. C'est un algorithme complexe difficile à implémenter qui nécessite son exécution par un matériel spécifique car il faut un mécanisme qui tienne compte du temps[37]. Algorithme FIFO (First In First Out)First In First Out (Premier entré, premier sorti) est un algorithme qui constitue une liste chaînée avec les pages présentent en mémoire. Quand un défaut de page intervient il retire la plus ancienne, donc celle qui est en début de file.Ce mécanisme ne tient pas compte de l'utilisation des pages ; une page peut être retirée et tout de suite après rechargée en mémoire car un processus en a besoin[38]. NRU remplacement de la page Non Récemment UtiliséeCet algorithme quant à lui utilise les bits R et M pour définir la page à retirer.
Le Bit R est positionné à 1 lorsqu'une page est Référencée et 0 lorsque la page n'est pas référencée. Le bit M est positionné à 1 lorsque la page est Modifiée et 0 lorsqu'elle ne l'est pas. Quand un défaut de page intervient l'algorithme NRU retire en premier la page non référencée et non modifiée en premier :
Dans ce dernier cas la page sera sauvegardée sur disque avant d'être transférée en mémoire[39]. ClockDans l'algorithme Clock, les pages sont mémorisées dans une liste circulaire en forme d'horloge, Un indicateur pointe sur la page la plus ancienne. Lorsqu'un défaut de page se produit, la page pointée par l'indicateur est examinée. Si le bit R de la page pointée par l'indicateur est à 0, la page est retirée, la nouvelle page est insérée à sa place et l'indicateur avance d'une position. Sinon, il est mis à 0 et l'indicateur avance d'une position. Cette opération est répétée jusqu'à ce qu'une page ayant R égal à 0 soit trouvée. À noter que lorsqu'une page est ajoutée, on met son bit de référence à 1. Cet algorithme est aussi appelé algorithme de la seconde chance. Performance dans une architecture Numa![]() Numa (Non Uniform Memory Access) est conçu pour les systèmes multiprocesseur dans lequel les zones mémoires sont séparées. L'architecture Numa sert à améliorer l'efficacité d'accès par les processeurs à tout l'espace mémoire, en effet, cet accès s'effectue par des Bus différents ce qui évite les baisses de performance liées aux éventuels accès concurrents par deux processeurs. Il existe aussi un autre type de gestion de la mémoire sur les multiprocesseurs : SMP (Symetric Multiprocessing), où il existe une seule mémoire partagée. Un mécanisme d’ordonnancement dynamique des tâches a été mis au point par Chiang, Yang et Tu (DTAS) qui réduit les phénomènes de contention dans les systèmes Multi-Cœur NUMA. Pour éviter ce problème, les cœurs des processeurs qui partagent les ressources sont programmés pour exécuter des tâches complémentaires[40]. Les tâches sont classifiées comme étant de type traitement ou de type mémoire, chaque processeur est dédié à un type de tâche. Si l'énergie doit être économisée, la fréquence d'horloge du processeur effectuant des tâches liées à la Mémoire est diminuée pour réduire la consommation. À l'inverse, on peut augmenter la fréquence d'horloge d'un processeur qui doit faire plus de traitement, dans un souci d'efficacité. Ce mécanisme a été implémenté sur un système avec un noyau Linux. Une amélioration de la performance de ce système a été constatée ainsi qu'une baisse de la consommation d'énergie en réduisant le taux de contentions entre les différents cœurs de processeurs. Les Benchmaks révèlent une amélioration de 28 % des performances sur des systèmes avec un noyau linux 3.11.0 (tests effectués sur 1000 instructions). Performance dans un environnement virtualisé![]() Shadow Page TablePlusieurs tables de pages sont utilisées dans le déroulement des translations d'adresses dans les technologies de virtualisation, c'est ce qui est mis en œuvre avec les shadow page tables[41]. Une table sert à convertir les adresses virtuelles invitées (gva guest virtual address) en adresses physiques invitées (gpa guest physical address). L'autre pour convertir les adresses physiques invitées (gpa guest physical address) en adresses physiques hôte (hpa host physical address)[42]. Une table de pages appelée Shadow Page Tables mappe les adresses virtuelles invitées directement vers les adresses physiques hôte en Dram[43]. SlatPour des raisons de performance, Slat (en) (Second Level Address Translation) se substitue à la technique des Shadow Page Tables[44]. La mémoire physique invitée est considérée comme un sous-ensemble de la mémoire physique de l'hôte. Les tables de pages sont utilisées à plusieurs niveaux, la table de page d'hôte peut être considérée conceptuellement comme imbriquée (nested) dans la table de page d'invités. Cela réduit les recherches dans le stables de pages, et par là même la charge du processeur. Extended Page Table (EPT) ou Table de Page étendue pour Intel, Nested Page Table (NPT) ou Table de Page Imbriquée pour AMD repose sur le même principe[45]. Élasticité de la mémoire : le ballooningMemory balloon[46] est une technique de gestion de la mémoire qui permet à un hôte physique de récupérer de la mémoire inutilisée sur ses machines virtuelles invitées (VM). Cela permet à la quantité totale de RAM requise par une VM invitée de dépasser la quantité de RAM physique disponible sur l'hôte. Lorsque le système hôte ne possède pas suffisamment de ressources physiques en RAM, une partie de la mémoire est affectée aux différents ordinateurs virtuels. Cela répond au besoin d’équilibrer les charges mémoire, l'hyperviseur réaffecte la mémoire inutilisée par certaines machines virtuelles pour permettre à d’autres machines plus consommatrices d’obtenir de meilleures performances[47],[48] SwapCachedL'idée principale de SwapCached est la mise en cache des pages mémoires de des machines invitées dans la machine hôte de façon à augmenter la performance de la plateforme entière. SwapCached est composé de trois modules : Cache Pool, Agent et Sensor. Les deux premiers composants sont dans l'hôte et contiennent les pages swappées et le dernier est localisé dans chaque machine invitée.Le prototype utilisé a été implémenté dans une plateforme Xen et a permis d'améliorer la performance globale de la plateforme de l'ordre de 10 % à 80 % en fonction des différents types de VM[49]. Performance dans un environnement mobileLe mécanisme de swapping (backing store[50]) n'est pas implémenté dans les mobiles, par exemple pour les terminaux sous iOS : chaque programme possède bien son propre espace de mémoire virtuelle, mais la quantité d'espace de mémoire disponible se limite à la mémoire physique. Ceci conduit à gérer la mémoire liée aux applications de façon spécifique : si la quantité de mémoire disponible descend en dessous d'un certain seuil, le système demande aux applications en cours de libérer de l'espace mémoire[51] : sur iOS, la gestion de la mémoire liée aux applications est gérée par jetsam, et de façon identique par OOM (Out Of Memory) sous Android[52],[53],[54],[55]. Dans ce contexte, Geunsik Lim propose dans Virtual memory partitioning for enhancing application performance in mobile platforms de mettre en place une gestion originale des applications en priorisant les applications natives, plutôt que les applications dont les sources sont moins fiables. Le mécanisme Virtual Memory Node, Vnode met en œuvre une isolation complète des applications peu fiables et réduit le nombre d'opérations des LMK/OOMK même quand les ressources mémoires sont critiques. La performance des applications natives est ainsi renforcée[56]. Pour autant, la mémoire à changement de phase (PCM) pourrait être amenée à être utilisée comme périphérique de swap. Yoo et Bahn présentent un nouvel algorithme de remplacement de page : DA-Clock (Dirtiness-Aware Clock). Les résultats expérimentaux montrent que l'algorithme améliore les performances de 24 à 74 % en minimisant le trafic en écriture sur la PCM, cet algorithme prolonge également la durée de vie de la mémoire de 50 % en moyenne[57]. Ce nouvel algorithme de remplacement de pages fonctionne sur les systèmes embarqués mobile qui utilisent de la DRAM comme mémoire principale et de la mémoire PCM comme périphérique de swap. Il s'inspire de l'algorithme Clock. Il garde la trace des pages et sous-pages dites dirty qui sont des pages contenant des données devant être écrites sur un support de stockage stable et se trouvant dans un cache avant d'être réclamées. Est remplacée la page la moins sale parmi les pages qui ont été le moins récemment utilisées. Pour ce faire, on utilise une liste circulaire et plusieurs listes de dirty pages dans lesquelles on sélectionne une page victime. Une autre équipe a testé une nouvelle technologie appelée Cows (Copy On Write Swap-in) qui augmente les performances . Dans cette technologie le mécanisme du swap a été totalement repensé pour les smartphones équipés de NVM (Non Volatile Memory). Au lieu d'utiliser de la mémoire flash on utilise la NVM comme zone se swap. Le mécanisme de copy-on-write swap-in évite des opérations de copies de la mémoire non nécessaires. Sur les Smartphones il se produit souvent un phénomène particulier : les processus sont tués en permanence, ceci est dû au fait que la mémoire est saturée et le swapping est désactivé sur les téléphones pour des raisons de performance. Une expérience de 2014 a révélé que sur un Téléphone Google Nexus 5 avec l'option swap activée, sur 30 Minutes de test, le nombre de process « tués » a diminué de 66 % à 91 % grâce à trois éléments :
Compression de la mémoireLa compression augmente la performance en permettant de réaliser la pagination en utilisant un bloc en mémoire RAM plutôt que sur le disque[59]. La zone de swap se trouve alors basée sur la RAM et fournit ainsi une forme de compression de mémoire virtuelle, permettant une performance accrue due au meilleur temps d'accès fourni par la RAM, le disque ayant un temps d'accès bien plus long. Il est dès lors d'autant plus important d'optimiser l'occupation de la mémoire principale. Srividya et Denakar proposent alors un mécanisme de dé-duplication de pages compressées : si une page compressée s'avère identique, au lieu d'être swappée, elle sera partagée[60]. Une nouvelle hiérarchie de la mémoireLes mémoires non volatiles (NVM) comme STT-RAM (Magnetoresistive RAM) ou Mémoire à changement de phase (PCM). Il existe d'abondantes recherches sur l'utilisation de la PCRAM comme remplacement des DRAM actuelle en tant que mémoire principale. Lee et al.[61] ont démontré qu'implémenter une architecture de mémoire basée exclusivement sur les PC-RAM serait environ 1,6 fois moins rapide et nécessiterait 2.2 fois plus d'énergie qu'une mémoire principale basée sur la DRAM, principalement en raison de la surcharge demandée par les opérations d'écriture. Pour améliorer cela, il propose d'organiser les buffers de la mémoire différemment de façon à diminuer la consommation d'énergie due aux opérations d'écriture. Qureshi[62] a proposé un système de mémoire principale hybride composée de PCM et de DRAM de façon à pouvoir tirer parti des avantages de la latence des DRAM et des avantages de la capacité de PCM. Cette architecture hybride pourrait réduire le nombre de défaut de page par 5 et améliorer la rapidité de traitement. Une étude similaire menée par Zhou[63] a démontré qu'une mémoire à base de PC-RAM ne consomme que 65 % de l'énergie totale de la mémoire principale de DRAM. Tous ces travaux démontrent la possibilité d'utiliser la PC-RAM comme mémoire principale[64],[65],[66],[67]. Protection apportée par la mémoire virtuelleLa mémoire virtuelle garantit qu'aucun processus n'écrive dans l'espace d'adressage d'un autre processus ou du système d'exploitation sans y avoir été expressément autorisé. Elle permet ainsi de se prémunir contre les erreurs des autres programmes car chaque programme possède son propre espace d'adressage, mais également d'actions malveillantes éventuelles : sans cette protection, les virus informatiques seraient très largement répandus. Pour autant, divers types d'attaque ont pu mettre au jour des failles et permettent de contourner les mécanismes de sécurité apportés par la mémoire virtuelle : Attaques par canal auxiliaireAttaque DMADMA est une méthode de transfert des données d'un périphérique vers la mémoire principale sans passer par le processeur, ce qui permet d'améliorer les performances de l'ordinateur[68]. Une application ne peut pas accéder à des emplacements de mémoire non explicitement autorisés par le contrôleur de mémoire virtuelle (MMU), ceci pour prévenir les dommages que causeraient des erreurs logicielles ou des manipulations malveillantes. Toutefois, pour permettre aux périphériques (par exemple un caméscope, une carte réseau) d'obtenir une vitesse de transfert maximale, le système d'exploitation autorise un accès direct à la mémoire principale. Le principe de l'attaque DMA, est alors de profiter de cette vulnérabilité pour accéder directement à une partie ou à la totalité l'espace d'adressage de la mémoire physique de l'ordinateur, et réussir ainsi à lire des données, ou les corrompre[69]. Il est ainsi possible de contourner l'identification par mot de passe demandée par l'ordinateur avec l'outil Inception[70]. Contre-mesure à l'attaque DMA : IOMMU![]() Une unité de gestion de mémoire d'entrée-sortie (IOMMU) est une unité de gestion de mémoire (MMU) qui connecte un bus des périphériques d'entrées/sortie d'accès direct à la mémoire (DMA) à la mémoire principale. Un exemple de IOMMU est la table des adresses graphiques (GART) utilisée par les cartes graphiques AGP et PCI Express sur les architectures Intel et AMD. Une IOMMU de la même façon qu'une MMU, traduit les adresses virtuelles en adresses physiques[71]. C'est donc une technologie qui applique le concept de mémoire virtuelle aux périphériques. Elle est utilisée aussi pour protéger la mémoire système contre des attaques véhiculées par les périphériques d'entrée-sortie comme l'attaque DMA. Cette protection devient critique dans les environnements virtualisés, parce que des machines virtuelles invitées partagent la même mémoire physique sur la machine hôte. Une VM malveillante pourrait corrompre une autre VM par une attaque DMA[72],[69]. L'IOMMU est composé d'un ensemble de DMA Remapping Hardware Units (DRHU) qui sont responsables de la traduction des adresses des périphériques vers des adresses physiques en mémoire hôte. Le DRHU identifie d'abord une demande DMA par le bus BDF-ID (Bus Device Function Number), puis il utilise le BDF-ID pour localiser les tables de page associées avec le contrôleur d'entrée sortie. Finalement, il traduit l'adresse virtuelle DMA (DVA) en adresse physique hôte (HPA), tout comme l'effectuerait une MMU classique. Bien que l'IOMMU offre une protection efficace contre les attaques DMA, il doit être configuré correctement de façon à prévenir ces attaques. Plusieurs techniques permettent en effet de contourner les défenses apportées par une IOMMU[73]. Par exemple, en se concentrant sur la technologie Intel VT-D, Lacombe et al. démontrent qu'aucun contrôle d'intégrité n'étant effectué sur le champ source-id, il est alors possible d'usurper l'identité d'un périphérique, celui partageant le même bus PCI Express avec tous les autres périphériques, ils ont pu mener une attaque de type ARP-poisoning[74]. Attaque par martèlement de mémoire![]() Yoongu et al. ont démontré qu'il était possible de profiter d'une vulnérabilité des mémoires vives (DRAM), déjà étudiée dans les travaux de Huang[75], pour modifier la valeur des bits mémoire en sollicitant les cellules de façon répétée. Cette faille matérielle (rowhammer bug), martèlement de mémoire, est lié à la charge des condensateurs qui a sans cesse besoin d'être rafraîchie pour éviter que les cellules ne passent à 0. En martelant certaines zones, à des fréquences spécifiques, des chercheurs en sécurité de Project Zero de Google, Mark Seaborn et Halvar Flake, ont exploité cette particularité pour modifier les droits d'accès à la mémoire et manipuler ainsi les données de diverses manières. En particulier, ils ont pu rompre l'isolement entre le mode utilisateur et le mode noyau : une application localise les cellules mémoires vulnérables et force le système d'exploitation à remplir la mémoire physique à partir des entrées de la table de page (PTE) qui définit les stratégies d'accès aux pages de mémoire et de prendre le contrôle d'un ordinateur[76],[77]. D. Gruss et C. Maurice ont pu déclencher le bug rowhammer à distance avec une application sous JavaScript. Pour autant, ils n'ont pas pu s'attribuer les droits root comme Seaborn l'avait fait, ce qui fera l'objet d'études ultérieures[78]. Une autre méthode d'attaque sur les DRAMs, basée sur du reverse engineering par les chercheurs Schwartz et al. a pu permettre de voler des données sensibles d'une machine virtuelle, en utilisant du code JavaScript (Code Reverse Engineering).Ils ont également amélioré l'attaque Rowhammer et a montré que, contrairement à ce que l'on pensait auparavant, la méthode fonctionnait aussi contre des RAMs de type DDR4[76],[79],[80]. Contre-mesure à l'attaque par martèlement de mémoireLa première méthode, baptisée B-CATT (Bootloader CAn't Touch This), ne nécessite aucune modification de l'OS et peut être utilisée sur tous les systèmes x86. B-CATT localise et désactive la mémoire physique vulnérable après l'avoir identifiée. La seconde méthode, G-CATT (Generic CAn't Touch This), n'empêche pas toutes les inversions de bits induites par une attaque Rowhammer, mais empêche celles qui seraient en mesure d'affecter la mémoire appartenant à des domaines de sécurité élevé comme celui du noyau. Selon les tests effectués par les chercheurs Ferdinand Brasseur et al., ces deux méthodes n'affectent ni la performance en ce qui concerne le temps d'accès à la mémoire ni en ce qui concerne la stabilité du système et permettraient de contrevenir à tous les types d'attaque rowhammer. Les deux mécanismes de protection n'ont eu que peu d'impact en ce qui concerne la latence et le débit sur les plateformes testées (SPEC CPU 2006 et Phoronix)[81]. Protection de l'espace mémoireContrôle d'accèsEn même temps que le processeur utilise la table d'entrée de pages (PTE) pour mapper les adresses virtuelles en adresses physiques, il utilise les informations de contrôle d'accès (Bits de protections) de cette même table, pour vérifier si un processus accède à la mémoire avec les autorisations adéquates. L'accès aux zones mémoire peut en effet être restreint pour plusieurs raisons :
La plupart des processeurs ont au moins deux modes d'exécution: le mode noyau et le mode utilisateur. On ne doit pas permettre que le code du noyau soit exécuté par un utilisateur ou que des structures de données du noyau soit accessibles. En mode noyau, le microprocesseur peut accéder à la mémoire physique, mais l’accès à un espace d’adressage virtuel (ou à toute autre zone de mémoire non définie) est interdit, il génère une interruption MMU. En mode utilisateur, le microprocesseur peut accéder à la mémoire virtuelle (plus précisément aux pages de mémoire virtuelle autorisées par la MMU), mais l’accès à la mémoire physique (ou à toute autre zone de mémoire non définie) génère une interruption[84]. Chaque processus possède son propre espace de mémoire virtuelle (4 Go) qui mappe la mémoire physique par le biais des tables de pages. La mémoire virtuelle est principalement divisée en deux parties: 3 Go pour l'utilisation du processus et 1 Go pour l'utilisation du noyau (Pour Linux) (Pour Windows 2 Go/2 Go) La plupart des données qui se trouvent dans la première partie de l'espace d'adressage représente l'espace utilisateur. La seconde partie correspond à l'espace du noyau commun à tous les processus.
Protection de la mémoire virtuelle contre un dépassement de tamponD'après Smashing the stack for fun and profit par Elias Levy (en)[85], les attaques par débordement de tampon (buffer overflow, parfois également appelées dépassement de mémoire tampon) ont pour principe l'exécution de codes arbitraires par un programme qui remplit le tampon par plus de données qu'il ne peut en recevoir. Le système d'exploitation répond alors par une erreur de segmentation, et met fin au processus en générant une exception[86],[87]. Une parade contre l'exécution de ce code arbitraire consiste à protéger l'espace exécutable. Cette technique est implémentée sur différents systèmes d'exploitation. Par exemple, dans une architecture Intel, le bit 'NX' ou non exécutable bit, qui est le bit 63 des entrées de la table des pages (PTE) permet d'empêcher une tentative d'exécution sur des données d'une page alors qu'elle est marquée comme non exécutable (no execute). Ceci permet de limiter l'exécution de codes malicieux[88]. Protection de la mémoire virtuelle contre un shellcodeA la suite d'un dépassement de tampon, un shellcode peut être exécuté pour prendre le contrôle d'un ordinateur. Les chercheurs de l'université de Colombus, Gu et al., proposent dans Malicious Shellcode Detection with Virtual Memory Snapshots une nouvelle méthode de détection de shellcodes malveillants. Des captures instantanées (snapshots) sont prises sur les données et permettent une analyse en temps réel des données. L'architecture mise en place repose sur trois modules :
Chiffrement des échanges avec la zone de SwapPlusieurs méthodes ont été mises en avant pour renforcer les mécanismes de sécurité de la MMU. Le chiffrement de l'espace de swap est utilisé pour protéger les informations sensibles. Pour une application qui échange des mots de passe, tant que ceux-ci demeurent en mémoire physique, ils seront effacés après un redémarrage. En revanche, si le système d'exploitation commence à échanger des pages mémoire pour libérer de l'espace pour d'autres applications, les mots de passe pourront être écrits sur l'espace disque sans être cryptés. Le cryptage et le décryptage des données avec la zone d'échange de Swap peut donc être une solution[90]. Gilmont et al. proposent d'implémenter une architecture basée sur une unité de gestion de la sécurité du matériel SMU, renforçant les mécanismes de sécurité, intégrité et confidentialité, apportés par l'Unité de gestion de mémoire classique qu'est la MMU. La SMU (Security Management Unit) permet au processeur d'exécuter du code chiffré et de manipuler des données chiffrées. Sa mémoire interne non volatile (NVM) est utilisée pour stocker des clés de chiffrement et des données critiques[91],[92].De façon à ne pas perdre en performance en chiffrant toutes les données indistinctement, Rahmattolah Amirsoufi a mis en œuvre un dispositif spécifique (ESAVM : Efficient Secure-Aware Virtual Memory) qui ne crypte et décrypte uniquement vers ou depuis la zone de swap, que les données spécifiquement confidentielles[93]. Consommation énergétiqueLes différents états de la mémoire vive![]() La mémoire vive peut avoir 4 états[94] :
Les transitions entre état se font obligatoirement entre l'état PRE et un autre. Chaque état à une consommation énergétique qui lui est propre. Comme chaque type de transition s'effectue par un temps mesurable, il a donc fallu réfléchir à diverses méthodes de gestion de la mémoire pour baisser la consommation énergétique de celles-ci. L'enjeu est donc de trouver des méthodes qui ne ralentissent pas les durées de traitement tout en diminuant la consommation, sinon le gain énergétique sera nul. Pour donner un ordre d'idée, la consommation électrique de la mémoire sur un serveur équipé de deux processeurs Intel Xeon X5667 avec 64 Go de mémoire Micron DDR2-800 est de 35 % de la consommation totale tandis que sur un smartphone Samsung Galaxy S3, elle est de 20 % en veille et 6 % téléphone actif[95]. Dans les environnements mobileDans les mobiles, du fait de l'alimentation sur batterie, la gestion de l'énergie est un des aspects sur lesquels travaillent le plus les constructeurs. En regardant les fiches techniques des téléphones des gammes Samsung Galaxy S ou Google Nexus, on peut constater que la quantité de mémoire a été en constante évolution depuis l'arrivée des smartphones (de 0.5 à 3 voire 4 Go en cinq ans). D'une manière générale, pour éviter de mauvaises performances, l'utilisation du swap est désactivée sur les smartphones et un système LMK (Low Memory Killer) tue les processus qui utilisent de la mémoire[96]. Consommation en environnement virtualiséDans un environnement virtualisé, la mémoire est gérée par l'hyperviseur, voici différentes manières de gérer les mémoires :
Il est à noter que la quantité de mémoire dans le serveur peut faire varier ses chiffres, plus il y aura de mémoire dans un serveur, plus la différence de consommation sera grande entre le mode standard ALL et les autres[98]. Rappels historiquesLe premier système intégrant la mémoire virtuelle est un serveur ASTRA conçu par un groupe d'Ingénieurs à Manchester en Angleterre en 1961. À la base de leur idée le concept "d'adresses", en effet, il devient évident à cette époque que l'adresse d'un process et son emplacement physique en mémoire sont deux notions à considérer de manière totalement distincte. Dans le milieu des années 1960 l'implémentation de la mémoire virtuelle dans l'architecture de la plupart des gros systèmes est devenue très courante. On la retrouve dans des ordinateurs tels que : IBM 360/85 et CDC 7600 et Burroughs B6500. Ce qui a amené les ingénieurs à trouver une solution au problème de taille de la Mémoire Physique c'est la complexité des programmes et l'arrivée de la multiprogrammation. En effet, les développeurs qui avaient , par le passé, à gérer les problèmes d'allocation mémoire dans leurs programmes devaient désormais consacrer plus de temps à rendre leurs traitements plus performants et efficaces[99]. La gestion de la mémoire devait donc, être sous traitée au Matériel : La MMU, afin qu'elle soit effectuée de manière automatique et totalement transparente pour les utilisateurs et les développeurs. Dans les années 1964 apparaissent les premiers systèmes Multics, Ce système révolutionnaire pour l'époque utilise le temps partagé, il est multiutilisateur et multitâches, Il est conçu avec un gestionnaire de mémoire virtuelle à segmentation. Les systèmes Multics seront vendus jusqu'en 2000 laissant la place aux systèmes UNIX. Le système BSD (Berkeley Software Distribution) fut le premier système UNIX à utiliser la Mémoire Virtuelle Paginée en 1977 sur Machine VAX 11/780. PerspectivesLa gestion de la mémoire virtuelle est très pratique mais a ses limites. Les systèmes à grande capacité mémoire font peu ou pas de Swapping car ils hébergent des applications critiques qui ne peuvent se permettre d'attendre les I/O disque. Google, par exemple, a constaté qu'une latence de quelques secondes entraine une baisse du trafic utilisateur de 20 % due à une insatisfaction des usagers. Ce qui a conduit les grands sites comme Facebook, Google, Microsoft Bing et Twitter à garder les données d'interface utilisateur en mémoire[100]. L'accès rapide aux données en mémoire est un enjeu très important pour l'avenir. Un groupe de chercheurs pour pallier les échecs du TLB proposent pour les Big Memory Server de translater une partie des adresses virtuelles de l'espace d'adressage avec un Segment Direct. Le segment direct est peu couteux au niveau hardware et permet de faire correspondre des zones contiguës de l'espace d'adressage virtuel avec des zones contiguës de l'espace d'adressage physique. Sur les Big Memory Server on observe 3 Éléments Importants :
Nouvelles TechnologiesBig Memory ServerSur les anciennes machines avec processeur 32 bits, la taille de page mémoire était de 4 ko. Mais les nouveaux systèmes, permettent de gérer des pages de plus grande taille, par exemple des pages de 1 Go. Les serveurs qui nécessitent de grandes quantités de mémoire RAM (Big Memory), et qui sont très gourmands en mémoire telles que les bases de données, les applications à hautes performances utilisées par exemple dans le big data peuvent utiliser des larges pages appelées encore huge pages pour Linux, large pages Windows, super page pour BSD. L'utilisation des pages de grande taille limite les échecs (TLB miss) lors de la recherche des pages en mémoire cache de la TLB. En effet, quand la taille d'une page est grande, une seule entrée du tampon TLB correspond à une grande portion de mémoire. Dans Large Pages on Steroids: Small Ideas to Accelerate Big Memory Applications D. Jung, S. Li, J. Ho Ahnn révèlent que pour les Big Memory Serveurs la solution pour rendre la gestion de la mémoire plus performante est l'implémentation des larges pages ou bien la segmentation directe[101]. RTMMUBönhert et Scholl ont mis au point une nouvelle technique le RTMMU (Real Time MMU), elle combine la gestion dynamique de mémoire et la gestion de la mémoire virtuelle dans un contexte de système en temps réel. Cette approche est conçue pour des systèmes qui ont de fortes contraintes de délais. Il fournit à l'usager la flexibilité des deux, la gestion dynamique et la gestion virtuelle de la mémoire. Cette technique est basée sur un nouveau composant du système d'exploitation et un nouveau matériel, le gestionnaire de mémoire virtuelle temps-réel : RTMMU. C'est un composant qui se situe entre la CPU et la Mémoire Centrale. Son but est de[102] :
Les résultats expérimentaux décrits dans A Dynamic Virtual Memory Management under Real-Time Constraints () démontrent la faisabilité de ce concept et confirment un temps constant en matière de gestion des opérations mémoire et une réduction de l'empreinte mémoire. Voici les résultats obtenus à la suite des tests :
Distributed Shared Virtual Memory (DSVM)![]() C'est en 1986, que Kai Li (en) a publié un thèse de doctorat, Shared Virtual Memory on Loosely Coupled Microprocessors ouvrant ainsi un champ de récherche sur ce qui est convenu d'appeler le DSVM (en)[103]. Dans les systèmes distribués, les différentes mémoires physiques sont logiquement partagées sur un grand espace d'adressage (mémoire virtuelle). Ainsi, les processus en cours accèdent à la mémoire physique à travers ces espaces d'adresses logiquement partagés. Le modèle de mémoire partagée fournit un espace d'adressage virtuel partagé entre tous les nœuds. Le terme «partagé» ne signifie pas qu'il existe une seule mémoire centralisée, mais essentiellement que c'est l'espace d'adressage qui est partagé. (la même adresse physique sur deux processeurs fait référence au même emplacement en mémoire). La performance dans les architectures distribuées avec DSVM (en) est un problème délicat, de nombreux chercheurs ont cherché à améliorer les problèmes de latence et de congestion car la DSVM utilise le réseau pour échanger des pages entre différents nœuds[104]. Différentes approches sont utilisées pour améliorer la performance de cette architecture. La méthode est basée sur la division des nœuds du système en différents groupes (clusters), chaque cluster comprend un nœud maître qui gère certaines fonctionnalités au travers d'un nouvel algorithme permettant de détecter l'état de la mémoire du système et de distribuer des pages sur tous les nœuds, effectuant ainsi une répartition de charge équilibrée[105]. Remote Memory ModelLes systèmes qui utilisent les mécanismes de la mémoire virtuelle utilisent des disques comme support de stockage. Au lieu de connecter un disque à chaque station de travail, les systèmes distribués permettent aux clients sans disque (en),de partager une ressource de stockage sur un serveur via le réseau. Le modèle de mémoire à distance (Remote Memory Model) fournit une nouvelle base pour l'architecture des systèmes distribués.Le modèle se compose de plusieurs machines clientes, de différentes machines serveurs, d'une ou plusieurs machines dédiées appelées serveurs de mémoire à distance et d'un canal de communication interconnectant toutes les machines.Pour améliorer les performances des échanges (délai) entre les clients et le serveur de mémoire à distance, on utilise un protocole de communication Xinu Paging Protocol (XPP), et Negative Acknowledgement Fragmentation Protocol (NAFP)[106]. Ce même principe est employé dans les équipements mobiles et les systèmes embarqués possédant une connexion réseau. La spécificité pour ces matériels étant de fonctionner avec des ressources mémoires restreintes. L'implémentation de la NVM (Network Virtual Memory) offre des contraintes quant à la rapidité de liens[107]. BibliographiePublications historiques
Publications relatives à la mise en œuvre de la gestion de la mémoire virtuelle
Publications relatives à la performance
Publications relatives au gestionnaire de mémoire dans un environnement virtualisé
Publications relatives à la sécurité
Publications relatives à la consommation énergétique
Publications relatives aux nouvelles techniques de la gestion de la mémoire
Notes et références
|
Portal di Ensiklopedia Dunia