Freigeben über


Virtuelle Adressräume

Prozessoren verwenden virtuelle Adressen beim Lesen aus oder Schreiben in Speicherorte. Während dieser Vorgänge übersetzt der Prozessor die virtuelle Adresse in eine physische Adresse.

Es gibt mehrere Vorteile für den Zugriff auf den Arbeitsspeicher mithilfe virtueller Adressen:

  • Ein Programm kann einen zusammenhängenden Bereich virtueller Adressen verwenden, um auf einen großen, nicht zusammenhängenden Speicherpuffer im physischen Speicher zuzugreifen.

  • Ein Programm kann einen Bereich virtueller Adressen verwenden, um auf einen Speicherpuffer zuzugreifen, der größer als der verfügbare physische Arbeitsspeicher ist. Wenn der physische Arbeitsspeicher niedrig ist, speichert der Speicher-Manager Seiten physischen Speichers (in der Regel 4 Kilobyte größe) in einer Datenträgerdatei. Das System verschiebt seiten von Daten oder Code nach Bedarf zwischen physischem Speicher und Datenträger.

  • Die von verschiedenen Prozessen verwendeten virtuellen Adressen sind isoliert. Der Code in einem Prozess kann den physischen Speicher, der von einem anderen Prozess oder Betriebssystem verwendet wird, nicht ändern.

Der Bereich der virtuellen Adressen, die einem Prozess zur Verfügung stehen, wird als virtueller Adressraum des Prozesses bezeichnet. Jeder Benutzermodusprozess verfügt über einen eigenen privaten virtuellen Adressraum.

  • Ein 32-Bit-Prozess verfügt in der Regel über einen virtuellen Adressraum innerhalb des 2-Gigabyte-Bereichs 0x00000000 bis 0x7FFFFFFF.

  • Ein 64-Bit-Prozess unter 64-Bit-Windows verfügt über einen virtuellen Adressraum innerhalb des 128-Terabyte-Bereichs 0x000'000000000 bis 0x7FFF'FFFFFFFF.

Ein Bereich virtueller Adressen wird manchmal als Bereich des virtuellen Speichers bezeichnet. Weitere Informationen finden Sie unter Speicher- und Adressraumbeschränkungen.

Das folgende Diagramm veranschaulicht einige wichtige Features von virtuellen Adressräumen.

Diagramm mit den virtuellen Adressräumen für zwei 64-Bit-Prozesse, Notepad.exe und MyApp.exe.

Das Diagramm zeigt die virtuellen Adressräume für zwei 64-Bit-Prozesse: Notepad.exe und MyApp.exe. Jeder Prozess verfügt über einen eigenen virtuellen Adressraum, von 0x000'0000000 bis 0x7FF'FFFFFFFF. Jeder schattierte Block stellt eine Seite (4 Kilobyte Größe) des virtuellen oder physischen Speichers dar. Der Notepad-Prozess verwendet drei zusammenhängende Seiten virtueller Adressen, beginnend bei 0x7F7'93950000. Diese drei zusammenhängenden Seiten virtueller Adressen werden jedoch nicht zusammenhängenden Seiten im physischen Speicher zugeordnet. Außerdem verwenden beide Prozesse eine Seite des virtuellen Speichers, die bei 0x7F7'939500000 beginnt, aber diese virtuellen Seiten entsprechen verschiedenen Seiten des physischen Speichers.

Benutzerbereich und Systemraum

Prozesse wie Notepad.exe und MyApp.exe im Benutzermodus ausgeführt werden. Kernkomponenten des Betriebssystems und viele Treiber werden im privilegierteren Kernelmodus ausgeführt. Weitere Informationen zu Prozessormodi finden Sie unter Benutzermodus und Kernelmodus.

Jeder Benutzermodusprozess verfügt über einen eigenen privaten virtuellen Adressraum, aber der gesamte Code, der im Kernelmodus ausgeführt wird, teilt einen einzelnen virtuellen Adressraum, der als Systemspeicher bezeichnet wird. Der virtuelle Adressraum für einen Benutzermodusprozess wird als Benutzerbereich bezeichnet.

In 32-Bit-Windows beträgt der verfügbare virtuelle Adressraum 2^32 Byte (4 Gigabyte). In der Regel werden die unteren 2 Gigabyte für den Benutzerspeicher verwendet, und die oberen 2 Gigabyte werden für den Systemspeicher verwendet.

Diagramm, das die Aufteilung des gesamten verfügbaren virtuellen Adressraums in 32-Bit-Windows in Benutzerraum und Systemraum veranschaulicht.

In 32-Bit-Windows können Sie (zur Startzeit) angeben, dass mehr als 2 Gigabyte für den Benutzerspeicher verfügbar sind. Dies bedeutet jedoch, dass weniger virtuelle Adressen für den Systemspeicher verfügbar sind. Sie können die Größe des Benutzerspeichers auf bis zu 3 Gigabyte erhöhen, sodass nur 1 Gigabyte für den Systemspeicher verfügbar sind. Verwenden Sie BCDEdit /set increaseuserva, um die Größe des Benutzerbereichs zu erhöhen.

In 64-Bit-Windows beträgt der theoretische Adressraum 2^64 Byte (16 Exabyte), aber nur ein kleiner Teil des 16-Exabyte-Bereichs wird tatsächlich verwendet.

Code, der im Benutzermodus ausgeführt wird, kann auf Den Benutzerbereich zugreifen, aber nicht auf Systemspeicher. Diese Einschränkung verhindert, dass Benutzermoduscode geschützte Betriebssystemdatenstrukturen liest oder ändert. Code, der im Kernelmodus ausgeführt wird, kann sowohl auf den Benutzerspeicher als auch auf den Systemspeicher zugreifen. Das heißt, Code, der im Kernelmodus ausgeführt wird, kann auf den Systemspeicher und den virtuellen Adressraum des aktuellen Benutzermodusprozesses zugreifen.

Treiber, die im Kernelmodus ausgeführt werden, müssen beim direkten Lesen oder Schreiben von Adressen im Benutzerbereich vorsichtig sein. Das folgende Szenario veranschaulicht, warum.

  1. Ein Benutzermodusprogramm initiiert eine Anforderung zum Lesen einiger Daten von einem Gerät. Das Programm stellt die Startadresse eines Puffers zum Empfangen der Daten bereit.

  2. Eine Gerätetreiberroutine, die im Kernelmodus ausgeführt wird, startet den Lesevorgang und gibt die Steuerung an den Aufrufer zurück.

  3. Später unterbricht das Gerät den aktuell ausgeführten Thread, um anzugeben, dass der Lesevorgang abgeschlossen ist. Kernelmodustreiberroutinen behandeln den Interrupt auf diesem beliebigen Thread, der zu einem beliebigen Prozess gehört.

  4. An diesem Punkt darf der Treiber die Daten nicht in die Startadresse schreiben, die das benutzermodusprogramm in Schritt 1 bereitgestellt hat. Diese Adresse befindet sich im virtuellen Adressraum des Prozesses, der die Anforderung initiiert hat, was wahrscheinlich nicht mit dem aktuellen Prozess übereinstimmt.

Ausgelagerter Pool und nicht ausgelagerter Pool

Im Benutzerspeicher können alle physischen Speicherseiten nach Bedarf auf eine Datenträgerdatei ausgelagert werden. Im Systembereich können einige physische Seiten ausgelagert werden, andere nicht. Der Systemspeicher verfügt über zwei Bereiche zur dynamischen Speicherzuordnung: Seitenspeicherpool und Nichtseitenspeicherpool.

Speicher, der im „Paged Pool“ zugeordnet ist, kann bei Bedarf in eine Datenträgerdatei ausgelagert werden. Speicher, der im nicht ausgelagerten Pool zugeordnet ist, kann niemals auf eine Datenträgerdatei ausgelagert werden.

Diagramm, das den Unterschied zwischen der Speicherzuordnung im Seitenpool zeigt.

Geräteknoten und Gerätestapel

Benutzermodus und Kernelmodus