Arbeitsspeicherschutz
Arbeitsspeicher, der zu einem Prozess gehört, wird implizit durch den privaten virtuellen Adressraum geschützt. Darüber hinaus bietet Windows Speicherschutz mithilfe der Hardware des virtuellen Speichers. Die Implementierung dieses Schutzes variiert je nach Prozessor, z. B. können Codepages im Adressraum eines Prozesses als schreibgeschützt gekennzeichnet und vor Änderungen durch Benutzermodusthreads geschützt werden.
Eine vollständige Liste der Attribute finden Sie unter Speicherschutzkonstanten.
Kopierschutz beim Schreiben
Kopierschutz ist eine Optimierung, die es mehreren Prozessen ermöglicht, ihre virtuellen Adressräume so zuzuordnen, dass sie eine physische Seite gemeinsam nutzen, bis einer der Prozesse die Seite ändert. Dies ist Teil einer Technik, die als verzögerte Auswertung bezeichnet wird, die es dem System ermöglicht, physischen Arbeitsspeicher und Zeit zu sparen, indem es einen Vorgang erst dann ausführt, wenn dies absolut notwendig ist.
Angenommen, zwei Prozesse laden Seiten aus derselben DLL in ihre virtuellen Speicherplätze. Diese Seiten des virtuellen Arbeitsspeichers werden für beide Prozesse denselben physischen Speicherseiten zugeordnet. Solange keiner der Prozesse auf diese Seiten schreibt, können sie dieselben physischen Seiten zuordnen und freigeben, wie im folgenden Diagramm dargestellt.
Wenn Prozess 1 auf eine dieser Seiten schreibt, wird der Inhalt der physischen Seite auf eine andere physische Seite kopiert, und die Zuordnung des virtuellen Speichers wird für Prozess 1 aktualisiert. Beide Prozesse verfügen nun über eine eigene instance der Seite im physischen Speicher. Daher ist es nicht möglich, dass ein Prozess auf eine freigegebene physische Seite schreibt und der andere Prozess die Änderungen anzeigt.
Laden von Anwendungen und DLLs
Wenn mehrere Instanzen derselben Windows-basierten Anwendung geladen werden, wird jede instance in einem eigenen geschützten virtuellen Adressraum ausgeführt. Ihre instance Handles (hInstance) haben jedoch in der Regel den gleichen Wert. Dieser Wert stellt die Basisadresse der Anwendung in ihrem virtuellen Adressraum dar. Wenn jedes instance in seine Standard-Basisadresse geladen werden kann, kann er die gleichen physischen Seiten mit den anderen Instanzen zuordnen und mit diesen teilen, wobei der Kopierschutz beim Schreiben verwendet wird. Das System ermöglicht es diesen Instanzen, die gleichen physischen Seiten zu teilen, bis eine von ihnen eine Seite ändert. Wenn eine dieser Instanzen aus irgendeinem Grund nicht in die gewünschte Basisadresse geladen werden kann, erhält sie ihre eigenen physischen Seiten.
DLLs werden mit einer Standardbasisadresse erstellt. Jeder Prozess, der eine DLL verwendet, versucht, die DLL in seinem eigenen Adressraum an der virtuellen Standardadresse für die DLL zu laden. Wenn mehrere Anwendungen eine DLL an ihrer virtuellen Standardadresse laden können, können sie die gleichen physischen Seiten für die DLL gemeinsam nutzen. Wenn ein Prozess die DLL aus irgendeinem Grund nicht an der Standardadresse laden kann, lädt er die DLL an eine andere Stelle. Der Kopierschutz erzwingt, dass einige Seiten der DLL für diesen Prozess in verschiedene physische Seiten kopiert werden, da die Korrekturen für Sprunganweisungen auf den Seiten der DLL geschrieben werden und sich für diesen Prozess unterscheiden. Wenn der Codeabschnitt viele Verweise auf den Datenabschnitt enthält, kann dies dazu führen, dass der gesamte Codeabschnitt auf neue physische Seiten kopiert wird.