Frage

Wie allgemein bekannt ist, ein Programm läuft unter 32-Bit-Windows-Betriebssystem hat nur 2 GB virtuellen Speicher zur Verfügung. Auch ist bekannt, dass die andere 2GB als Kernel Raum reserviert sind. Aber was ist eigentlich in diesem Kernraum?

Ich konnte Reserve für Kernel benötigt versteht sich, aber warum Kernraum in einem WSU von Prozess? Danke.

War es hilfreich?

Lösung

Erhalten Buch des Windows Internals, es beschreibt dies in blutigen Details. Für die kurze Zusammenfassung aber einige Dinge, die im Kernel virtuellen Adresse (KVA) Raum sind:

1) Der Kernel und HAL

2) Die Gerätetreiber

3) Die Kernel-Modus-Haufen (die Exekutive Pools genannt, die ich immer amüsant finden)

4) Die exportierten Objekte in dem Benutzermodus über Griffe (Prozess, Thread, Ereignis, Mutex usw. Objekte)

5) System PTEs, die alle möglichen interessanten Dinge Karte weg von den schmuddeligen Benutzermodus-Anwendungen (zum Beispiel die Ausführungsstapel, dass Threads verwenden, wenn im Kernel-Modus ausgeführt wird)

6) Der Dateisystem-Cache

Und die Liste geht weiter und weiter ... Wie ich schon sagte, lesen Sie Windows Internals.

-Scott

Andere Tipps

Der Grund, dass Kernel-Speicher in den virtuellen Adressraum jeden Prozesses zugeordnet ist, ist so, dass ein Kontextwechsel in Kernel-Modus muss nicht die Tabellen Prozess Seite ändern. Die aktuelle Berechtigungsstufe wird lediglich auf 0 angehoben, die sofort den Seiten zugänglich macht.

Die Seitentabellen haben nur dann eingeschaltet werden, wenn ein anderer Prozess umgeschaltet wird. Da dies eine teure Operation ist (z. B. es erfordert eine TLB-Leerungs), minimiert die Häufigkeit der es ein Gewinn ist.

Außerdem, wenn Sie haben Schalter in speziellen Kernel Seitentabellen ging man zu den Kernel eingeschaltet, dann würden Sie einen Teil des User-Space-Adressraum holen, um zu ersetzen. Dies würde derjenigediejenigedasjenige User-Space addressess unzugänglich für den Kernel machen, der Bounce-Puffer oder mehr Adressraum Ausmisten etwa wenn Daten in diesen Bereichen werden sollten übertragen oder aus dem Kernel erforderlich machen würde.

Meiner Meinung nach gibt es noch eine kleine Tatsache über die Grenze 2GB bekannt. Viele Anwendungen in der Regel Arbeit mit vielen Zeigerarithmetik (insbesondere Anwendungen in C geschrieben, C ++, ...). Bei diesen Anwendungen ist es durchaus üblich Offsets Zeiger hinzuzufügen, oder sogar Zeiger zu subtrahieren.

Wenn Ihre verfügbaren virtuellen Adressraum 2 GB ist, werden Sie garantiert, dass Subtraktion zweier Zeiger immer zwischen -2147483647 und 2147483648 (das sind die Grenzwerte für 32-Bit-Werte mit Vorzeichen).

Wenn Sie Ihren Adressraum 3 GB sei, würde die mögliche Differenz größer sein als jeder Wert, der in einem 32-Bit-Wert mit Vorzeichen dargestellt werden kann.

Wenn Sie wissen, dass Ihre Anwendung sicher ist und nicht völlig unabhängig Zeiger subtrahieren (und Ihre Arrays sind weniger als 2 GB!), Können Sie Windows sagen, dass Ihre Anwendung mit einem Adressraum größer als 2 GB arbeiten können, durch den Linker Einstellung Flagge LARGEADDRESSAWARE (oder dies mit dem EDITBIN Dienstprogramm gesetzt).

Mit XP (nicht ganz sicher über Vista und W7) Sie können in einen Modus booten, wo das ‚Kernel-Space‘ nur 1 GB und 3 GB in dem virtuellen Adressraum für die Anwendung verlassen. Wenn Ihre Anwendung LARGEADDRESSAWARE ist, erhalten Sie die volle 3GB. Wenn nicht, Sie nur 2 GB bekommen.

Auf 64-Bit-Windows, LARGEADDRESSAWARE 32-Bit-Anwendungen sogar 4GB bekommen, seit Windows benötigt keinen wesentlichen Adressraum in dem 32-Bit-Bereich (immerhin, es ist ein 64-Bit-OS).

geschriebenes Programm in Hochsprache, wie C ++, wird schließlich auf OS-API-Aufrufe übersetzt, speziell Windows-API für Windows O. Viele Windows-API, wie Createfile, sind tatsächlich Gespräch mit Kernel-Modus-Treiber. Kernel-Space in dem Prozess-Adressraum ist für die Zuteilung von Kernel-Ressourcen für diesen Prozess verwendet. Zum Beispiel Treiber IOCTL Anrufe enthalten Eingabe-Ausgabe-Puffer, zwischen Benutzermodus-API und Treiber übergeben. Solche Puffer sind in dem Prozess Kernraum zugeordnet.

Im Allgemeinen Kernel-Space enthält zugewiesenen Ressourcen von Kernelmoduskomponenten im Namen dieses Prozesses.

Ihre Frage scheint „Warum“ nicht „was“, wie vorbringen im Titel zu sein.

Auch Ihre Frage setzt voraus, 32-Bit. 64-Bit-Versionen von Windows sehr unterschiedlich sind (zum Beispiel die VAS ist 8TB oder 7TB auf einem Itanium-System).

Wie bei dem „Warum“, wie würden Sie Zeiger von einer Kernfunktion (wie ein Treiber) übergeben, die nicht in der VAS des Prozesses enthalten? Ein gutes Buch lesen Sie diese, um herauszufinden, würde Windows Internals sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top