
Depuis la sortie de l'édition précédente de ce livre, le système d'exploitation Windows a parcouru un long chemin avec des mises à jour et des changements conceptuels qui ont abouti à une nouvelle architecture stable pour le noyau Windows 10.
Le livre «Windows Internal Device» a été créé pour les professionnels qui veulent comprendre la vie intérieure des principaux composants de Windows 10. Sur la base de ces informations, il sera plus facile pour les développeurs de trouver les bonnes solutions de conception en créant des applications pour la plate-forme Windows et de résoudre les problèmes complexes associés à leur fonctionnement. Les administrateurs système, sachant ce qui se trouve sous le capot sous le système d'exploitation, pourront comprendre le comportement du système et résoudre plus rapidement les problèmes d'augmentation de la productivité et de diagnostic des pannes. Les professionnels de la sécurité auront besoin d'informations pour gérer les vulnérabilités du système d'exploitation.
Dynamique de la liste de pages
Dans la fig. 5.37 montre un diagramme d'état des transitions des blocs de page. Par souci de simplicité, il ne fournit pas de liste de pages modifiées mais non enregistrables.
Les blocs de pages se déplacent entre les listes de pages des manières suivantes.
1. Lorsqu'un gestionnaire de mémoire a besoin d'une page remplie de zéros pour corriger une erreur de page liée à la nécessité de réinitialiser la page (accès à une page définie comme étant entièrement remplie de zéros ou à une page en mode utilisateur fermée et confirmée qui n'a pas encore été consultée), d'abord une tentative est faite pour obtenir cette page à partir de la liste de ces pages. Si la liste est vide, la page est extraite de la liste des pages libres et remplie de zéros. Si la liste des pages libres est vide, une liste des pages en attente est accessible et une page de cette liste est remplie de zéros.
2. L'une des raisons de la demande de pages remplies de zéros est le respect de diverses exigences de sécurité - par exemple, des critères communs (Critères communs). La plupart des dispositions des critères généraux indiquent que les processus en mode utilisateur doivent recevoir des blocs de pages mis à zéro afin qu'ils ne puissent pas lire le contenu en mémoire des processus précédents. Par conséquent, le gestionnaire de mémoire fournit des processus en mode utilisateur avec des blocs de page annulés, sauf si la page a été lue à partir du stockage de sauvegarde. Dans ce cas, le gestionnaire de mémoire utilise des blocs de pages non réinitialisés, les initialisant avec des données du disque ou du stockage distant. La liste des pages remplies de zéros est reconstituée à partir de la liste des pages libres avec un thread de programme système appelé le thread de page zéro - il s'agit du thread 0 dans le processus système. Le flux de mise à zéro de page attend qu'un signal fonctionne depuis l'objet passerelle. Lorsqu'il y a huit pages ou plus dans la liste gratuite, la passerelle émet un bip. Mais le thread de mise à zéro des pages n'est démarré que si au moins un processeur n'a pas d'autres threads exécutables, car le thread de mise à zéro des pages commence par la priorité 0 et la priorité la plus basse qui peut être définie pour le flux utilisateur est 1.
REMARQUE Lorsque la mémoire due à l'allocation d'une page physique par un pilote appelant la fonction MmAllocatePagesForMdl ou MmAllocatePagesForMdlEx doit être remplie de zéros par l'application Windows appelant la fonction AllocateUserPhysicalPages ou AllocateUserPhysicalPagesNuma, ou lorsque l'application affecte la mémoire à la mémoire qui utilise de grandes pages, la mémoire utilise la mémoire qui utilise de grandes pages la mémoire qui utilise la mémoire vide affiche des zones plus grandes qu'un flux de mise à zéro de page, ne réinitialisant qu'une seule page à la fois. De plus, sur les systèmes multiprocesseurs, le gestionnaire de mémoire crée un thread système supplémentaire pour la mise à zéro en mode parallèle (et sur les plates-formes NUMA, cela se fait dans un style optimisé pour la technologie NUMA).
3. Lorsque le gestionnaire de mémoire n'a pas besoin d'une page remplie de zéros, il accède d'abord à la liste des pages libres. Si cette liste est vide, elle va à la liste des pages mises à zéro. Si la liste des pages mises à zéro est vide, elle passe à la liste des pages en attente. Avant que le gestionnaire de mémoire puisse utiliser le bloc de pages de la liste des pages en attente, il doit d'abord revenir en arrière et supprimer le lien de l'enregistrement PTE non valide (ou de l'enregistrement PTE prototype), qui pointe toujours vers le bloc de pages. Étant donné que les entrées de la base de données de numéros PFN contiennent des pointeurs en arrière vers la page précédente de la table de pages utilisateur (ou vers la page de pool d'enregistrements PTE prototype pour les pages partagées), le gestionnaire de mémoire peut rapidement trouver l'enregistrement PTE et effectuer la modification correspondante.
4. Lorsqu'un processus doit abandonner une page de son jeu de travail (soit parce qu'il fait référence à une nouvelle page et que son jeu de travail est plein, soit parce que le gestionnaire de mémoire a coupé son jeu de travail), la page passe à la liste d'attente si elle est restée intacte. (inchangé), ou à la liste des pages modifiées, si la page a été modifiée en mémoire physique.
5. Une fois le processus terminé, toutes les pages fermées vont à la liste des pages libres. De plus, si lors de la fermeture du dernier lien vers la section prise en charge par le fichier d'échange, la section n'a aucune vue affichée, les pages de cette section tombent également dans la liste des pages libres.
EXPÉRIENCE: VOIR LES LISTES DE PAGES GRATUITES ET ZÉRO
La libération des pages fermées à la fin d'un processus peut être observée dans la fenêtre Informations système de Process Explorer. Vous devez d'abord créer un processus avec beaucoup de pages fermées dans son jeu de travail. Nous l'avons déjà fait dans l'une des expériences précédentes en utilisant l'utilitaire TestLimit:
C:\Tools\Sysinternals>Testlimit.exe -d 1 -c 1500 Testlimit v5.24 - test Windows limits Copyright (C) 2012-2015 Mark Russinovich Sysinternals - www.sysinternals.com Process ID: 13928 Leaking private bytes with touch 1 MB at a time... Leaked 1500 MB of private memory (1500 MB total leaked). Lasterror: 0 The operation completed successfully.
Le commutateur –d permet à TestLimit non seulement de sélectionner la mémoire comme fermée et confirmée, mais également de la «toucher», c'est-à-dire d'accéder à cette mémoire. Il en résulte l'allocation de mémoire physique et son affectation au processus afin de libérer la zone de mémoire virtuelle fermée et confirmée. Si le système dispose d'une quantité suffisante de RAM disponible, jusqu'à 1 500 Mo seront alloués au processus en RAM. Maintenant, ce processus attendra jusqu'à ce que vous le forçiez à terminer ou à interrompre le travail (éventuellement avec la combinaison de touches Ctrl + C dans sa fenêtre de commande). Suivez ces étapes.
1. Ouvrez Process Explorer.
2. Sélectionnez la commande AfficherInformations système et sélectionnez l'onglet Mémoire.
3. Observez la taille des listes de pages libres (mises à zéro) et gratuites (mises à zéro).
4. Mettez fin ou abandonnez le processus TestLimit.
Vous pourrez peut-être voir que la liste des pages gratuites a augmenté momentanément en taille. Nous disons «peut-être» parce que le flux de mise à zéro des pages se «réveillera» dès qu'il n'y aura que huit entrées dans la liste des pages mises à zéro, et cela fonctionnera très rapidement. Process Explorer ne rafraîchit cette fenêtre qu'une fois par seconde, et il semble que le reste des pages ait déjà le temps de se réinitialiser dans la liste des pages de réinitialisation, alors que nous avons réussi à "attraper" cet état. Si vous parvenez à remarquer une augmentation temporaire de la liste des pages libres, alors vous verrez que sa taille tombera à zéro et une augmentation correspondante se produira dans la liste des pages mises à zéro. Si le moment est manqué, vous voyez juste une augmentation de la liste des pages mises à zéro.
EXPÉRIENCE: VOIR LES LISTES DES PAGES MODIFIÉES ET ATTENDUES
Le déplacement des pages de l'ensemble de travail du processus vers la liste des pages modifiées puis vers la liste des pages en attente peut être observé à l'aide des programmes VMMap et RAMMap du package Sysinternals ou du débogueur du noyau. Suivez ces étapes.
1. Exécutez le programme RAMMap et observez l'état calme du système. Dans ce cas, il s'agit d'un système x86 avec 3 Go de RAM. Les colonnes de la fenêtre reflètent les différents états des pages (voir Fig. 5.37). Certaines colonnes qui ne sont pas pertinentes pour cette expérience ont été réduites pour plus de commodité.
2. Le système dispose d'environ 420 Mo de RAM libre (composée de pages gratuites et mises à zéro). Environ 580 Mo apparaissent dans la liste des pages d'attente (par conséquent, certaines d'entre elles sont «disponibles», mais elles contiennent très probablement des données précédemment perdues par des processus ou utilisées dans le super-échantillonnage). Environ 830 Mo sont actifs, mappés directement sur des adresses virtuelles via des entrées de table de pages valides.
3. Chaque ligne est ensuite décomposée selon les états des pages par usage ou origine (pages process fermées, fichier affiché, etc.). Par exemple, au moment des 830 Mo actifs, environ 400 Mo sont dus à l'allocation de pages fermées du processus.
4. Maintenant, comme dans l'expérience précédente, utilisez l'utilitaire TestLimit pour créer un processus avec un grand nombre de pages dans le jeu de travail. Là encore, nous utilisons le commutateur –d pour forcer TestLimit à écrire sur chaque page, mais cette fois sans limitation, pour créer autant de pages modifiées fermées que possible:
C:\Tools\Sysinternals>Testlimit.exe -d Testlimit v5.24 - test Windows limits Copyright (C) 2012-2015 Mark Russinovich Sysinternals - www.sysinternals.com Process ID: 7548 Leaking private bytes with touch (MB)... Leaked 1975 MB of private memory (1975 MB total leaked). Lasterror: 8
5. Maintenant, TestLimit a créé 1975 zones d'allocation de 1 Mo chacune. Pour mettre à jour l'écran dans RAMMap, vous devez utiliser la commande FileRefresh pour mettre à jour l'écran, car RAMMap ne le fait pas tout seul (en raison du coût élevé de cette opération).
6. Comme vous pouvez le voir, plus de 2,8 Go sont actifs, dont 2,4 Go dans la ligne des pages de processus fermées (Process Private line). Ceci est le résultat de l'allocation de mémoire et de son accès à partir du processus TestLimit. Notez également que les listes de pages de veille, de mise à zéro et gratuites sont désormais beaucoup plus petites. La plupart de la mémoire allouée à TestLimit provient des pages répertoriées dans ces listes.
7. Ensuite, à l'aide de RAMMap, vous devez évaluer l'allocation des pages physiques du processus. Accédez à l'onglet Pages physiques et définissez le filtre en bas de la colonne Processus, en le définissant sur Testlimit.exe. La fenêtre suivante affiche toutes les pages physiques qui font partie de l'ensemble de travail du processus.
8. Nous devons identifier la page physique impliquée dans l'allocation de l'espace d'adressage physique, qui a été effectuée à l'aide du commutateur –d lors du lancement du programme TestLimit. RAMMap ne donne aucune indication sur les zones virtuelles qui ont été allouées en raison de l'appel de la fonction RAMMap VirtualAlloc. Mais nous pouvons obtenir un indice précieux à ce sujet en utilisant le programme VMMap. En appelant VMMap pour
du même processus, on obtient le résultat suivant (voir figure page 535 ci-dessus).
9. Au bas des informations affichées se trouvent des centaines de zones allouées pour les données de processus fermées, chacune ayant une taille de 1 Mo avec 1 Mo de mémoire confirmée. Cela correspond à la taille de la mémoire allouée par TestLimit. La capture d'écran précédente met en évidence la première de ces options de distribution. Notez que son adresse virtuelle de départ est 0x310000.
10. Revenons maintenant aux informations sur la mémoire physique affichées à l'écran par le programme RAMMap. Réorganisez les colonnes afin que la colonne Adresse virtuelle soit clairement visible. Cliquez dessus pour trier les lignes selon cette valeur, et vous pouvez trouver l'adresse virtuelle souhaitée (voir la figure page 535 ci-dessous).
11. Ici, il est montré que la page virtuelle commençant par l'adresse 0x310000 est actuellement mappée à l'adresse physique 0x212D1000. Avec le commutateur -d, TestLimit écrit son nom dans les premiers octets de chaque zone sélectionnée. Cela peut être démontré en utilisant la commande! Dc du débogueur de noyau local (dc signifie «afficher les caractères», c'est-à-dire sortir des caractères vers une adresse physique):
lkd> !dc 0x212d1000 #212d1000 74736554 696d694c 00000074 00000000 TestLimit....... #212d1010 00000000 00000000 00000000 00000000 ................ ...
12. Si vous tardez, la tentative peut échouer - la page peut déjà être supprimée du jeu de travail. Dans la dernière phase de l'expérience, nous montrerons que les données restent inchangées (au moins pendant un certain temps) après la réduction de l'ensemble de travail du processus, et la page passe d'abord à la liste des modifications, puis aux pages d'attente.
13. Après avoir sélectionné le processus TestLimit dans le programme VMMap, ouvrez le menu Affichage et sélectionnez la commande Empty Working Set pour minimiser l'ensemble de travail du processus. Maintenant, dans la fenêtre VMMap, les informations suivantes doivent être affichées:
14. Notez que la ligne Working Set est presque vide. La partie centrale du processus montre que la taille totale de l'ensemble de travail n'est que de 4 Ko, avec presque tout son espace occupé par des tables de pages. Revenez maintenant à RAMMap. Sous l'onglet Utiliser le nombre, vous pouvez voir que le nombre de pages actives a été considérablement réduit et qu'un grand nombre de pages figurent dans la liste des modifications et un nombre important de pages dans la liste d'attente.
15. Les données de l'onglet Processus de RAMMap confirment que la plupart de ces pages figuraient dans ces listes en raison du processus TestLimit.
»Plus d'informations sur le livre sont disponibles sur
le site Web de l'éditeur»
Contenu»
Extrait20% de réduction sur le coupon pour
Windows -
Windows