2017-05-30 3 views
-2

Wenn jeder Prozess auf einem Windows 2012 R2-Server einen eigenen Heap hat, ist es dann nicht möglich, dass ein Prozess den Heap eines anderen Prozesses beschädigt? Ich denke, es wäre möglich, da alle Heaps in einem "globalen" Adressraum gespeichert werden, aber ein AV tritt auf, wenn ein Prozess versucht, aus dem Speicher außerhalb des Adressraums zu schreiben oder zu lesen das den Adressraum besaß?Heap Corruption Auswirkung auf einen Windows 2012 R2-Server

+0

Ein Prozess kann niemals versehentlich den Speicher eines anderen Prozesses beschädigen. Das gilt für jede Windows-Version in der [Windows NT] (https://en.wikipedia.org/wiki/Windows_NT) -Familie. Seit fast 25 Jahren. – IInspectable

Antwort

2

Sie müssen lesen, wie virtual memory funktioniert. Es gibt keinen allumfassenden Adressraum.

Es gibt physische RAM-Adressen und physikalische Festplattenadressen, die sich nicht vom Prozess unterscheiden. Aber Benutzermoduscode verwendet diese niemals direkt.

Stattdessen bietet die Speicherverwaltungseinheit eine Zuordnung von virtuellen Adressen zu physischen Adressen. Da die Seitentabellen prozessspezifisch sind, ist diese Zuordnung für jeden Prozess eindeutig. Nur Code 0 (Kernel-Modus) kann den Mapping-Schritt umgehen, dies wird in der Hardware erzwungen. Wenn es bei Benutzerprozessen keine Zuordnung zu einer bestimmten physischen Adresse gibt, kann von diesem Kontext aus einfach nicht darauf zugegriffen werden, da es keine Möglichkeit gibt, diesen physischen Speicherort mit virtuellen Adressen zu benennen. Und es gibt keine Zuordnungen, die zu den Seitentabellen selbst führen.

Dies ist der Unterschied zwischen einer Speicherverwaltungseinheit und ihrem kleineren Bruder, der Speicherschutzeinheit. Architekturen, die eine Speicherschutzeinheit verwenden, haben ein einziges globales Adressierungsschema, mit Hardware-erzwungenen Berechtigungsbits, die wiederum nur durch privilegierten Code modifiziert werden können.

Die Sache gefragt Sie

einen Prozess von [sic] oder aus dem Speicher gelesen zu schreiben versucht, außerhalb [sic] ist Adressraum

einfach nicht existieren. Es ist wie die Frage nach der Telefonnummer meines Autos. Mein Auto ist durch eine Fahrgestellnummer und ein Nummernschild gekennzeichnet, aber keiner von beiden erlaubt es Ihnen, über das Telefonsystem mit ihm zu sprechen.

Zugriffsverletzungen (manchmal auch Segmentierungsfehler genannt) treten auf, wenn ein Prozess versucht, in nicht zugeordnete Teile seines eigenen Adressraums zu schreiben, von ihm zu lesen oder auszuführen oder Seiten, die explizit für das Auffangen von Zugriffsversuchen festgelegt wurden Erweiterung vielleicht oder Copy-on-Write). Alle Speicherzugriffe eines Prozesses werden per Definition innerhalb seines Adressraums interpretiert.