Das Buch "Internes Gerät Windows. 7. Aufl

Bild Seit der Veröffentlichung der vorherigen Ausgabe dieses Buches hat das Windows-Betriebssystem mit Updates und konzeptionellen Änderungen, die zu einer neuen stabilen Architektur für den Windows 10-Kernel geführt haben, einen langen Weg zurückgelegt.

Das Buch „Windows Internal Device“ wurde für Fachleute erstellt, die das Innenleben der Hauptkomponenten von Windows 10 verstehen möchten. Auf der Grundlage dieser Informationen können Entwickler leichter die richtigen Entwurfslösungen finden, indem sie Anwendungen für die Windows-Plattform erstellen und komplexe Probleme im Zusammenhang mit ihrem Betrieb lösen. Systemadministratoren, die wissen, was sich unter der Haube des Betriebssystems befindet, können das Verhalten des Systems verstehen und Probleme bei der Steigerung der Produktivität und der Diagnose von Fehlern schnell lösen. Sicherheitsexperten benötigen Informationen zum Umgang mit Schwachstellen im Betriebssystem.

Dynamik der Seitenliste


In Abb. 5.37 zeigt ein Zustandsdiagramm von Übergängen von Seitenblöcken. Der Einfachheit halber wird keine Liste geänderter, aber nicht aufzeichnbarer Seiten bereitgestellt.

Bild

Seitenblöcke werden auf folgende Weise zwischen Seitenlisten verschoben.

1. Wenn ein Speichermanager eine mit Nullen gefüllte Seite benötigt, um einen Seitenfehler im Zusammenhang mit der Anforderung zum Zurücksetzen der Seite zu beheben (Zugriff auf eine Seite, die als vollständig mit Nullen gefüllt definiert ist, oder auf eine geschlossene, bestätigte Seite im Benutzermodus, auf die noch nicht zugegriffen wurde) Es wird versucht, diese Seite aus der Liste solcher Seiten zu entfernen. Wenn die Liste leer ist, wird die Seite aus der Liste der freien Seiten entnommen und mit Nullen gefüllt. Wenn die Liste der freien Seiten leer ist, wird auf eine Liste der wartenden Seiten zugegriffen und eine Seite aus dieser Liste wird mit Nullen gefüllt.

2. Einer der Gründe für die Nachfrage nach mit Nullen gefüllten Seiten ist die Erfüllung verschiedener Sicherheitsanforderungen - beispielsweise gemeinsamer Kriterien (Common Criteria). Die meisten Bestimmungen der allgemeinen Kriterien geben an, dass Prozesse im Benutzermodus Seitenblöcke mit Nullen erhalten sollten, damit sie den Speicherinhalt früherer Prozesse nicht lesen können. Daher stellt der Speichermanager Prozesse im Benutzermodus mit ungültig gemachten Seitenblöcken bereit, es sei denn, die Seite wurde aus dem Sicherungsspeicher gelesen. In diesem Fall verwendet der Speichermanager nicht zurückgesetzte Seitenblöcke und initialisiert sie mit Daten von der Festplatte oder vom Remotespeicher. Die Liste der mit Nullen gefüllten Seiten wird aus der Liste der freien Seiten mit einem Systemprogramm-Thread ergänzt, der als Null-Seiten-Thread bezeichnet wird. Dies ist Thread 0 im Systemprozess. Der Stream zum Nullstellen der Seite wartet darauf, dass ein Signal vom Gateway-Objekt ausgeführt wird. Wenn die freie Liste acht oder mehr Seiten enthält, piept das Gateway. Der Thread zum Nullstellen der Seite wird jedoch nur gestartet, wenn mindestens ein Prozessor keine anderen ausführbaren Threads hat, da der Thread zum Nullstellen der Seite mit der Priorität 0 beginnt und die niedrigste Priorität, die für den Benutzerstrom festgelegt werden kann, 1 ist.
HINWEIS Wenn der Speicher aufgrund der Zuweisung einer physischen Seite durch einen Treiber, der die Funktion MmAllocatePagesForMdl oder MmAllocatePagesForMdlEx aufruft, von der Windows-Anwendung, die die Funktion AllocateUserPhysicalPages oder AllocateUserPhysicalPagesNuma aufruft, mit Nullen gefüllt werden muss, oder wenn die Anwendung den Arbeitsspeicher verwendet, verwendet der Funktionsmanager den Arbeitsspeicher Zeigt größere Bereiche als den Stream zum Nullstellen der Seite an und setzt jeweils nur eine Seite zurück. Darüber hinaus erstellt der Speichermanager auf Multiprozessorsystemen einen zusätzlichen Systemthread zum Nullstellen im parallelen Modus (und auf NUMA-Plattformen erfolgt dies in einem für die NUMA-Technologie optimierten Stil).

3. Wenn der Speichermanager keine mit Nullen gefüllte Seite benötigt, greift er zuerst auf die Liste der freien Seiten zu. Wenn diese Liste leer ist, wird zur Liste der auf Null gesetzten Seiten gewechselt. Wenn die Liste der auf Null gesetzten Seiten leer ist, wird die Liste der ausstehenden Seiten angezeigt. Bevor der Speichermanager den Seitenblock aus der Liste der wartenden Seiten verwenden kann, muss er zunächst den Link aus dem ungültigen PTE-Datensatz (oder aus dem Prototyp-PTE-Datensatz) entfernen, der weiterhin auf den Seitenblock verweist. Da PFN-Nummerndatenbankeinträge Rückwärtszeiger auf die vorherige Seite der Benutzerseitentabelle (oder auf die Prototyp-PTE-Datensatzpoolseite für freigegebene Seiten) enthalten, kann der Speichermanager den PTE-Datensatz schnell finden und die entsprechende Änderung vornehmen.

4. Wenn ein Prozess eine Seite aus ihrem Arbeitssatz entfernen muss (entweder weil sie auf eine neue Seite verweist und ihr Arbeitssatz voll ist oder weil der Speichermanager ihren Arbeitssatz gekürzt hat), wird die Seite auf die Warteliste verschoben, wenn sie unberührt bleibt (unverändert) oder in die Liste der geänderten Seiten, wenn die Seite im physischen Speicher geändert wurde.

5. Wenn der Vorgang abgeschlossen ist, werden alle geschlossenen Seiten in die Liste der freien Seiten aufgenommen. Wenn beim Schließen des letzten Links zu dem von der Auslagerungsdatei unterstützten Abschnitt keine angezeigten Ansichten angezeigt werden, fallen die Seiten dieses Abschnitts ebenfalls in die Liste der freien Seiten.

EXPERIMENT: ANZEIGEN VON LISTEN KOSTENLOSER UND NULL-SEITEN


Die Freigabe geschlossener Seiten am Ende eines Prozesses kann im Systeminformationsfenster des Prozess-Explorers beobachtet werden. Zuerst müssen Sie einen Prozess mit vielen geschlossenen Seiten in seinem Arbeitssatz erstellen. Wir haben dies bereits in einem der vorherigen Experimente mit dem TestLimit-Dienstprogramm durchgeführt:

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. 

Mit dem Schalter –d wählt TestLimit den Speicher nicht nur als geschlossen und bestätigt aus, sondern berührt ihn auch, dh greift auf diesen Speicher zu. Dies führt zur Zuweisung des physischen Speichers und seiner Zuordnung zum Prozess, um den Bereich des geschlossenen, bestätigten virtuellen Speichers freizugeben. Wenn das System über ausreichend verfügbaren RAM verfügt, werden bis zu 1.500 MB für den Prozess im RAM zugewiesen. Dieser Vorgang wartet nun, bis Sie ihn zwingen, die Arbeit abzuschließen oder zu unterbrechen (möglicherweise mit der Tastenkombination Strg + C im Befehlsfenster). Befolgen Sie diese Schritte.

1. Öffnen Sie den Prozess-Explorer.

2. Wählen Sie den Befehl ViewSystem Information und dann die Registerkarte Memory.

3. Beobachten Sie die Größe der Listen der freien (Zeroed) und Free (Zeroed) Seiten.

4. Beenden oder brechen Sie den TestLimit-Prozess ab.

Möglicherweise können Sie feststellen, dass die Liste der freien Seiten vorübergehend größer geworden ist. Wir sagen "vielleicht", weil der Seiten-Nullungs-Stream "aufwacht", sobald nur acht Einträge in der Liste der Null-Seiten vorhanden sind, und es wird sehr schnell funktionieren. Der Prozess-Explorer aktualisiert dieses Fenster nur einmal pro Sekunde, und es scheint, dass der Rest der Seiten bereits Zeit hat, auf die Liste der zurückgesetzten Seiten zurückzusetzen, während wir diesen Status "abfangen" konnten. Wenn Sie eine vorübergehende Zunahme der Liste der freien Seiten feststellen, werden Sie danach feststellen, dass die Größe auf Null sinkt und die Liste der auf Null gesetzten Seiten entsprechend zunimmt. Wenn der Moment verpasst wird, sehen Sie nur eine Zunahme in der Liste der auf Null gesetzten Seiten.

EXPERIMENT: ANZEIGEN VON LISTEN GEÄNDERTER UND ERWARTETER SEITEN


Das Verschieben von Seiten aus dem Arbeitssatz des Prozesses in die Liste der geänderten Seiten und dann in die Liste der wartenden Seiten kann mit den Programmen VMMap und RAMMap aus dem Sysinternals-Paket oder im Kernel-Debugger beobachtet werden. Befolgen Sie diese Schritte.

1. Führen Sie das RAMMap-Programm aus und beobachten Sie den Ruhezustand des Systems. In diesem Fall handelt es sich um ein x86-System mit 3 GB RAM. Die Spalten im Fenster geben die verschiedenen Zustände der Seiten wieder (siehe Abb. 5.37). Einige Spalten, die für dieses Experiment nicht relevant sind, wurden der Einfachheit halber eingegrenzt.

Bild

2. Das System verfügt über ca. 420 MB freien RAM (bestehend aus freien und auf Null gesetzten Seiten). In der Liste der wartenden Seiten werden ca. 580 MB angezeigt (einige davon sind daher „verfügbar“, enthalten jedoch höchstwahrscheinlich Daten, die zuvor durch Prozesse verloren gegangen sind oder für Super-Sampling verwendet wurden). Etwa 830 MB sind aktiv und werden über gültige Seitentabelleneinträge direkt virtuellen Adressen zugeordnet.

3. Jede Zeile ist weiter nach den Zuständen der Seiten nach Verwendung oder Herkunft (geschlossene Prozessseiten, angezeigte Datei usw.) unterteilt. Zum Beispiel sind zum Zeitpunkt der aktiven 830 MB etwa 400 MB auf die Zuweisung geschlossener Seiten des Prozesses zurückzuführen.

4. Verwenden Sie jetzt wie im vorherigen Experiment das Dienstprogramm TestLimit, um einen Prozess mit einer großen Anzahl von Seiten im Arbeitssatz zu erstellen. Auch hier verwenden wir den Schalter –d, um TestLimit zu zwingen, auf jede Seite zu schreiben, diesmal jedoch ohne Einschränkung, um so viele geschlossene modifizierte Seiten wie möglich zu erstellen:

 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. Jetzt hat TestLimit 1975 Zuordnungsbereiche von jeweils 1 MB erstellt. Um den Bildschirm in RAMMap zu aktualisieren, müssen Sie den Befehl FileRefresh verwenden, um den Bildschirm zu aktualisieren, da RAMMap dies nicht alleine tut (aufgrund der hohen Kosten dieses Vorgangs).

Bild

6. Wie Sie sehen können, sind über 2,8 GB aktiv, von denen 2,4 GB in der Zeile geschlossener Prozessseiten (Zeile Private Prozess) enthalten sind. Dies ist das Ergebnis der Zuweisung von Speicher und des Zugriffs über den TestLimit-Prozess. Beachten Sie auch, dass die Listen der Standby-, Zeroed- und Free-Seiten jetzt viel kleiner sind. Der größte Teil des TestLimit zugewiesenen Speichers wurde von den in diesen Listen aufgeführten Seiten entnommen.

7. Als Nächstes müssen Sie mithilfe von RAMMap die Zuordnung der physischen Seiten des Prozesses bewerten. Gehen Sie zur Registerkarte Physikalische Seiten und setzen Sie den Filter am unteren Rand der Spalte Prozess auf Testlimit.exe. Das nächste Fenster zeigt alle physischen Seiten, die Teil des Arbeitssatzes des Prozesses sind.

Bild

8. Wir müssen die physische Seite identifizieren, die an der Zuweisung des physischen Adressraums beteiligt ist, die beim Starten des TestLimit-Programms mit dem Schalter –d ausgeführt wurde. RAMMap gibt keinen Hinweis darauf, welche virtuellen Bereiche aufgrund des Aufrufs der RAMMap-Funktion VirtualAlloc zugewiesen wurden. Mit dem VMMap-Programm können wir jedoch einen wertvollen Hinweis zu diesem Thema erhalten. Durch Aufrufen von VMMap für
Mit demselben Verfahren erhalten wir das folgende Ergebnis (siehe Abbildung oben auf Seite 535).

9. Am Ende der angezeigten Informationen befinden sich Hunderte von zugewiesenen Bereichen für geschlossene Prozessdaten, von denen jeder eine Größe von 1 MB mit 1 MB bestätigtem Speicher hat. Dies entspricht der von TestLimit zugewiesenen Speichergröße. Die vorherige Bildschirmaufnahme hebt die erste dieser Verteilungsoptionen hervor. Beachten Sie, dass die virtuelle Startadresse 0x310000 lautet.

10. Kehren Sie nun zu den Informationen über den physischen Speicher zurück, die vom RAMMap-Programm auf dem Bildschirm angezeigt werden. Ordnen Sie die Spalten neu an, sodass die Spalte Virtuelle Adresse deutlich sichtbar ist. Klicken Sie darauf, um die Zeilen nach diesem Wert zu sortieren. Dort finden Sie die gewünschte virtuelle Adresse (siehe Abbildung auf Seite 535 unten).

Bild

11. Hier wird gezeigt, dass die virtuelle Seite, die mit der Adresse 0x310000 beginnt, derzeit der physischen Adresse 0x212D1000 zugeordnet ist. Mit der Option -d schreibt TestLimit seinen Namen in die ersten Bytes jedes ausgewählten Bereichs. Dies kann mit dem Befehl! Dc des lokalen Kernel-Debuggers demonstriert werden (dc steht für "Anzeigezeichen", dh Ausgabe von Zeichen an eine physikalische Adresse):

 lkd> !dc 0x212d1000 #212d1000 74736554 696d694c 00000074 00000000 TestLimit....... #212d1010 00000000 00000000 00000000 00000000 ................ ... 

12. Wenn Sie sich verspäten, schlägt der Versuch möglicherweise fehl. Die Seite wurde möglicherweise bereits aus dem Arbeitssatz gelöscht. In der letzten Phase des Experiments werden wir zeigen, dass die Daten (zumindest für eine Weile) unverändert bleiben, nachdem der Arbeitssatz des Prozesses reduziert wurde und die Seite zuerst zur Liste der geänderten und dann zu den wartenden Seiten verschoben wird.

13. Nachdem Sie den TestLimit-Prozess im VMMap-Programm ausgewählt haben, öffnen Sie das Menü Ansicht und wählen Sie den Befehl Leerer Arbeitssatz, um den Arbeitssatz des Prozesses zu minimieren. Jetzt sollten im VMMap-Fenster die folgenden Informationen angezeigt werden:

Bild

14. Beachten Sie, dass die Working Set-Zeile fast leer ist. Der mittlere Teil des Prozesses zeigt, dass die Gesamtgröße des Arbeitssatzes nur 4 KB beträgt, wobei fast der gesamte Speicherplatz von Seitentabellen belegt wird. Kehren Sie nun zu RAMMap zurück. Auf der Registerkarte Anzahl der Verwendungszwecke können Sie feststellen, dass die Anzahl der aktiven Seiten erheblich abgenommen hat und eine große Anzahl von Seiten in der Liste der geänderten und eine erhebliche Anzahl von Seiten in der Warteliste enthalten ist.

Bild

15. Die Daten auf der Registerkarte Prozesse von RAMMap bestätigen, dass die meisten dieser Seiten aufgrund des TestLimit-Prozesses in diesen Listen angezeigt wurden.

Bild


»Weitere Informationen zum Buch finden Sie auf der Website des Herausgebers
» Inhalt
» Auszug

20% Rabatt auf Gutschein für Windows - Windows

Source: https://habr.com/ru/post/de422269/


All Articles