Gewusst wie: Zuordnen von Adapter RAM in Prozess-Adressbereich

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 189327 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Wenn Sie eine große Menge an Adapter Arbeitsspeicher zuordnen, erhalten Sie die folgenden Symptome auftreten:
  • Nichtverfügbarkeit von System-PTEs (NO_MORE_SYSTEM_PTES).
  • Nicht genügend zusammenhängender Prozess-Adressbereich.
Dieser Artikel erläutert:
  • Warum treten diese Probleme
  • wie Sie diese umgehen
  • zwei Möglichkeiten, einen Prozess-Adressbereich Adapter Speicher zugeordnet

Weitere Informationen

Einführung in die Page Table Entries (PTE)

Jeder Prozess, der auf einem Windows NT-System ausgeführt wird hat 4 GB virtuellen Adresse im Bereich von 0 x 00000000 bis 0xFFFFFFFF für seine Verwendung. Aus diesem Grund die oberen 2 GB-Adresse im Bereich von 0x8000000 bis 0xFFFFFFFF häufig alle Prozesse im System ausgeführt wird, und es Kernel- oder Adressraum aufgerufen. Der untere Bereich im Bereich von 0 x 00000000 bis 0x7FFFFFFF wird Benutzer Adressraum bezeichnet.

Aus der Perspektive Prozess verweist jedes Element der virtuellen Adresse konzeptionell auf ein Byte physischen Speichers. Ist zuständig von der Virtual Memory Manager (VMM) zusammen mit Prozessor Memory Manager Unit (MMU) zu übersetzen oder jede virtuelle Adresse in eine entsprechende physische Adresse zuzuordnen. Der VMM führt die Zuordnung durch Aufteilen des RAM in Seitenrahmen fester Größe, Seite Tabellen speichern Informationen über diese Seite Frames erstellen und zuordnen. Jeder TABELLENEINTRAG stellt einen Seitenrahmen dar und enthält Informationen, die für VMM zu eine Seite notwendig sind zuzuordnen.

Auf einem X 86-basierten System, das eine Seitengröße von 4 KB verwendet, ist die maximale Anzahl der Seitentabelleneinträge erforderlich, um 2 GB Adressraum 524,288 (2 GB/4 KB). Dieser Speicherplatz wird auf einem typischen System wie folgt verwendet:
  • Ein Maximum von 50.000 PTEs (ungefähr 195 MB-Adressraum) sind für die allgemeine Verwendung reserviert.
  • Der Rest wird in Zuordnung Systemcache, Hyperspace, ausgelagertem Pool, nicht ausgelagerten Pool, Bereich für Absturzspeicherabbild usw. verwendet.
Diese Poolgröße wird automatisch beim Systemstart basierend auf die Größe des physischen Speichers in das System bestimmt. Dieser Pool wird zwischen ausgelagertem Pool und nicht ausgelagerten Pool, der ebenfalls mit des physischen Arbeitsspeichers im System sowie wächst eingefügt.

Das System verwendet diese PTEs Kernel Threadstapel erstellen, laden Gerätetreiber (und die DLLs), Zuordnen von System virtuellen Adressraum für e/a-Übertragungen oder Aufrufer von MmMapIoSpace-MmMapLockedPages/MmGetSystemAddressForMdl-MmAllocateNonCachedMemory und andere verschiedene Zwecke. Dieses System Pool mit SEITENTABELLENEINTRÄGEN kann stark verwendet und stark fragmentiert werden. Dies bedeutet, die der Treiber möglicherweise nicht ausreichend zusammenhängenden virtuellen Adressraum zu jedem Zeitpunkt vom System Pool mit SEITENTABELLENEINTRÄGEN abrufen können, obwohl die Summe Speicherplatz noch darin Adresse möglicherweise groß genug.

Dies bedeutet auch, wenn der Treiber bis Pool mit SEITENTABELLENEINTRÄGEN vollständig verwendet wird, andere Teile des Systems, auch resultierenden in Threads, die nicht erstellt beeinträchtigt, System Stellplätze und sofortiges Fehler überprüft (da einige Treiber reservieren-System-Memory mit gesetztem Parameter MustSucceed aufrufen).

Sie müssen sehr vorsichtig, wenn diese nur-Pool-Zuordnung verwenden sein. Verwenden Sie die Teile der Adapter-RAM, dass Sie tatsächlich System benötigen Zugriff auf die von jedem Prozesskontext, und ordnen nur die Menge, die Sie benötigen. Ordnen Sie den Bereich gesamte Adapter nicht , wenn Sie nicht tatsächlich benötigen darauf alle vom System Modus zugreifen.

wichtig : unmap den Speicher, sobald Sie im rechten Prozesskontext fertig sind. Andernfalls führt das System außerhalb der Seitentabelleneinträge, und es werden Kontrollkästchen Fehler. Sie können erhöhen Sie die standardmäßige Anzahl PTEs berechnet basieren der Registrierung des gesamten Systemspeichers - bis auf einen Höchstwert durch Hinzufügen einer Zahl (gleich der Anzahl der Seiten erhöht werden):
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
   \Memory Management\SystemPages
				
Sie können auch überwachen derzeit verfügbaren "Freie Seitentabelleneinträge" mithilfe des Systemmonitors.

Hinweis : die Adapter Speicher-Seiten werden nicht für Seite Ersatz verwendet. Sie verbleiben in den Prozess-Adressbereich zugeordnet, auch wenn der Prozess im Leerlauf oder vollständig vertauscht out ist.

Folgende sind die zwei häufigsten Möglichkeiten zum Adapter Speicher zuzuordnen. Die erste Methode ordnet den Speicher direkt in Benutzer-Speicherplatz für den Prozess und die zweite Methode ordnet in der System-Prozessbereich und optional Benutzer Speicherplatz. Beide Methoden erfordern den physischen Speicher zusammenhängend sein müssen. Aufgrund der Einschränkung PTE Sie sehr viel Speicher im System Speicherplatz zuordnen möglicherweise nicht. Allerdings können Sie möglicherweise in der Benutzer-Speicherplatz zuordnen, wenn er nicht fragmentiert oder aufgebraucht.

Abschnitt Objekt-Methode

In der Windows NT 4.0 DDK (verfügbar über MSDN Professional-Mitgliedschaft), das wie diese Zuordnung durchgeführt werden ist ein Beispiel (MAPMEM). Hier ist eine Gliederung des Verfahrens:

  1. Die übersetzte physikalische Adresse des Adapters Speichers erhalten (HalTranslateBusAddress).
  2. Öffnen Sie ein Abschnitt Handle (ZwOpenSection) für den physischen Speicher Gerät \Device\PhysicalMemory.
  3. Verweisen auf das Objekthandle (ObReferenceObjectByHandle), um zu verhindern, wird gelöscht.
  4. Ordnen Sie den Speicher (ZwMapViewOfSection).
Die virtuelle Adresse, die Sie aus der ZwMapViewOfSection abrufen, ist nur im Kontext des Prozesses er zugeordnet ist gültig. Wenn Sie Zugriff auf den Speicher des Treibers deferred Procedure Call (DPC) oder interrupt Service Routine (ISR) in einen beliebigen Prozesskontext ausgeführt wird, sollten Sie auch den Speicher im System-Adressraum (verwenden Sie die nächste Methode) zuordnen. Unmap (ZwUnMapViewOfSection) den Speicher in der gleichen Prozesskontext, den Sie vor dem zugeordnet wird beendet.

Hinweis : gefährlich, verwenden Sie die ZwMapViewOfSection \Device\PhysicalMemory verwenden, sofern Sie bereits die physischen Seiten besitzen im Allgemeinen möglich. Ein Treiber, der ordnet Seiten, dass er nicht fast immer Ursachen Speicherbeschädigung besitzt da der Besitzer die Attribute Seite ändern kann die Seiten frei und andere Änderungen vornehmen. Laufwerke sollten nur den Speicher zuordnen, den Sie besitzen. Außerdem ist es streng unzulässige gleichzeitig mit zwei verschiedene Attribute eine physische Adresse zuordnen (d. h. Vs noncached Vs Writecombined zwischengespeichert). Dies bewirkt, dass Prozessor TLB Beschädigung und unvorhersehbaren Ergebnissen.

Auf WindowsXP gibt die Funktion ZwMapViewOfSection STATUS_CONFLICTING_ADDRESSES Fehler zurück, wenn Treiber versuchen, die gleiche physische Adresse gleichzeitig mit in Konflikt stehende Attribute zuzuordnen.

MmMapIoSpace-Methode

Diese Methode zeigt, wie Speicher in den Prozessadressraum System und Prozess-Adressbereich Benutzer zuzuordnen.
  1. Rufen Sie die übersetzte physikalische Adresse des Adapters Speichers (HalTranslateBusAddress).
  2. Den Speicher nicht ausgelagerten System Adressraum wie folgt zugeordnet:
          SystemVirtualAddress = MmMapIoSpace(PhysicalAddress, SizeofMemory,
             CacheEnable);
    					
  3. Reservieren einer Mdl:
          Mdl = IoAllocateMdl(SystemVirtualAddress, SizeOfMemory, FALSE, FALSE,
             NULL);
  4. MDL beschreiben Sie die Speicherseiten erstellen:
          MmBuildMdlForNonPagedPool(Mdl);
  5. Ordnen Sie den Speicher in den Prozess des Benutzer Speicherplatz mithilfe von MmMapLockedPages. Da eine Inkonsistenz im Rückgabewert dieser Funktion zwischen Pre-SP4 und nach-SP4-Versionen von Windows NT, verwenden Sie die folgende Anweisung, um diesen Code mit allen Versionen von Windows NT kompatibel zu machen:
          UserVirtualAddress = (PVOID)(((ULONG)PAGE_ALIGN(MmMapLockedPages(Mdl,
             Mode))) + MmGetMdlByteOffset(Mdl));
    					
Weitere Informationen finden Sie die Artikel der Microsoft Knowledge Base:
199311INFO: Das MmMapLockedPages gibt aktuelle virtuelle Adresse in SP4
Der Vorteil dieser Methode ist, Sie erhalten, SystemVirtualAddress, die in jedem Prozesskontext (z. B. DPCs und ISR) verwendet werden kann und ein UserVirtualAddress, die von der Benutzermodus-Anwendung verwendet werden kann, in die Kontext er zugeordnet ist.

Wenn Sie in System-Adressraum zuordnen, Sie sollten unmap wie folgt:
MmUnmapIoSpace(SystemVirtualAddress, SizeofMemory);
				
If Sie Adressbereich Benutzer zuordnen, Sie sollten unmap wie folgt nur während der Ausführung im Kontext des Prozesses, in dem Sie den Speicher zugeordnet:
MmUnmapLockedPages(UserVirtualAddress, Mdl); 

Finally, free the MDL by calling:

IoFreeMdl(Mdl);
				

Informationsquellen

Weitere Informationen finden Sie unter der Windows NT 4.0-DDK-Dokumentation oder "in Windows NT" von Helen Cluster (Microsoft Press 1993).

Eigenschaften

Artikel-ID: 189327 - Geändert am: Montag, 7. März 2005 - Version: 1.2
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Win32 Device Driver Kit für Windows NT 4.0
Keywords: 
kbmt kbhowto kbkmode KB189327 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 189327
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Disclaimer zu nicht mehr gepflegten KB-Inhalten
Dieser Artikel wurde für Produkte verfasst, für die Microsoft keinen Support mehr anbietet. Der Artikel wird deshalb in der vorliegenden Form bereitgestellt und nicht mehr weiter aktualisiert.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com