Speicherschutz
Speicher, der zu einem Prozess gehört, wird implizit durch seinen privaten virtuellen Adressraum geschützt. Darüber hinaus bietet Windows Speicherschutz mithilfe der virtuellen Speicherhardware. Die Implementierung dieses Schutzes variiert je nach Prozessor, z. B. können Codeseiten im Adressraum eines Prozesses schreibgeschützt markiert und vor Änderungen durch Benutzermodusthreads geschützt werden.
Die vollständige Liste der Attribute finden Sie unter Speicherschutzkonstanten.
Kopieren-on-Write-Schutz
Kopieren-on-Write-Schutz ist eine Optimierung, mit der mehrere Prozesse ihre virtuellen Adressräume zuordnen können, sodass sie eine physische Seite freigeben, bis einer der Prozesse die Seite ändert. Dies ist Teil einer Technik namens faulen Auswertung, die es dem System ermöglicht, physischen Arbeitsspeicher und Zeit zu sparen, indem er einen Vorgang erst dann ausführt, wenn es absolut notwendig ist.
Angenommen, zwei Prozesse laden Seiten aus derselben DLL in ihre virtuellen Speicherplätze. Diese virtuellen Speicherseiten werden den gleichen physischen Speicherseiten für beide Prozesse zugeordnet. Solange kein Prozess auf diese Seiten schreibt, können sie den gleichen physischen Seiten zuordnen und freigeben, wie im folgenden Diagramm dargestellt.
Wenn Prozess 1 auf eine dieser Seiten schreibt, werden die Inhalte der physischen Seite auf eine andere physische Seite kopiert, und die virtuelle Speicherzuordnung wird für Prozess 1 aktualisiert. Beide Prozesse verfügen jetzt über eine eigene Instanz der Seite im physischen Speicher. Daher ist es für einen Prozess nicht möglich, auf eine freigegebene physische Seite zu schreiben und für den anderen Prozess die Änderungen anzuzeigen.
Laden von Anwendungen und DLLs
Wenn mehrere Instanzen derselben Windows-basierten Anwendung geladen werden, wird jede Instanz in einem eigenen geschützten virtuellen Adressraum ausgeführt. Ihre Instanzhandles (hInstance) weisen in der Regel denselben Wert auf. Dieser Wert stellt die Basisadresse der Anwendung im virtuellen Adressbereich dar. Wenn jede Instanz in ihre Standardbasisadresse geladen werden kann, kann sie die gleichen physischen Seiten mit den anderen Instanzen zuordnen und gemeinsam nutzen, indem sie den Kopier-on-Write-Schutz verwenden. Das System ermöglicht es diesen Instanzen, dieselben physischen Seiten gemeinsam zu nutzen, bis einer von ihnen eine Seite ändert. Wenn eine dieser Instanzen aus irgendeinem Grund nicht in die gewünschte Basisadresse geladen werden kann, empfängt sie eigene physische Seiten.
DLLs werden mit einer Standardbasisadresse erstellt. Jeder Prozess, der eine DLL verwendet, versucht, die DLL in seinem eigenen Adressraum an der standardmäßigen virtuellen Adresse für die DLL zu laden. Wenn mehrere Anwendungen eine DLL an ihrer standardmäßigen virtuellen Adresse laden können, können sie dieselben physischen Seiten für die DLL freigeben. Wenn ein Prozess aus irgendeinem Grund die DLL nicht an der Standardadresse laden kann, lädt er die DLL an anderer Stelle. Kopieren-on-Write-Schutz erzwingt, dass einige der DLL-Seiten in verschiedene physische Seiten für diesen Prozess kopiert werden, da die Korrekturen für Sprunganweisungen auf den Seiten der DLL geschrieben werden und sie für diesen Prozess unterschiedlich sein werden. 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.