Freigeben über


MmAllocateMdlForIoSpace-Funktion (wdm.h)

Die MmAllocateMdlForIoSpace Routine weist eine MDL- zu und initialisiert diese MDL, um einen Satz physischer Adressbereiche im E/A-Adressraum zu beschreiben.

Syntax

NTSTATUS MmAllocateMdlForIoSpace(
  [in]  PMM_PHYSICAL_ADDRESS_LIST PhysicalAddressList,
  [in]  SIZE_T                    NumberOfEntries,
  [out] PMDL                      *NewMdl
);

Parameter

[in] PhysicalAddressList

Ein Zeiger auf ein Array von MM_PHYSICAL_ADDRESS_LIST Strukturen, die die physischen Adressbereiche beschreiben, die in die zugeordnete MDL aufgenommen werden sollen.

[in] NumberOfEntries

Die Anzahl der Elemente im MM_PHYSICAL_ADDRESS_LIST Array, auf die durch PhysicalAddressListverwiesen wird.

[out] NewMdl

Ein Zeiger auf eine Position, an die die Routine einen Zeiger auf die neu zugeordnete MDL schreibt.

Rückgabewert

MmAllocateMdlForIoSpace gibt STATUS_SUCCESS zurück, wenn dies erfolgreich ist. Mögliche Fehlerrückgabewerte sind die folgenden Statuscodes.

Rückgabecode Beschreibung
STATUS_INVALID_PARAMETER_1 Eine physische Adresse wird nicht an einer Seitengrenze ausgerichtet. oder ein physischer Adressbereich ist kein Vielfaches der Seitengröße; oder ein physischer Adressbereich wird vom Betriebssystem für RAM verwendet und steht nicht für die Verwendung als E/A-Speicherplatz zur Verfügung.
STATUS_INSUFFICIENT_RESOURCES Unzureichende Systemressourcen sind verfügbar, um den angeforderten Vorgang auszuführen.

Gehen Sie nicht davon aus, dass die vorherige Liste der Fehlerrücklaufcodes erschöpfend ist. Die Routine gibt möglicherweise Fehlercodes zurück, die nicht in der Liste angezeigt werden.

Bemerkungen

Diese Routine akzeptiert als Eingabeparameter ein Array von MM_PHYSICAL_ADDRESS_LIST Strukturen, die einen Satz physischer Adressbereiche im E/A-Adressraum beschreiben, und weist eine MDL zu, die diese Bereiche beschreibt. Aufeinander folgende physische Adressbereiche im Array müssen nicht zusammenhängend sein.

Die physischen Adressbereiche im PhysicalAddressList Arrays müssen die folgenden Bedingungen erfüllen:

  • Die physische Basisadresse für jeden Bereich muss an einer PAGE_SIZE Grenze im Arbeitsspeicher ausgerichtet werden.

  • Die Größe jedes Bereichs in Byte muss ein ganzzahliges Vielfaches von PAGE_SIZE sein.

  • Alle physischen Adressbereiche müssen sich im Arbeitsspeicher befinden, der als E/A-Adressraum verwendet werden kann. Sie können sich nicht im Arbeitsspeicher befinden, der vom Betriebssystem für RAM verwendet wird.

  • Die Gesamtgröße aller Bereiche muss kleiner als 4 Gigabyte sein. Insbesondere darf die Gesamtgröße 2^32 - 1 Bytes nicht überschreiten.

Der Aufrufer ist dafür verantwortlich, die zugewiesene MDL freizuweisen, wenn sie nicht mehr benötigt wird. Rufen Sie zum Freigeben der MDL die IoFreeMdl Routine auf. Weitere Informationen zu MDLs finden Sie unter Verwenden von MDLs.

Die von MmAllocateMdlForIoSpace erstellte MDL ist nicht dem virtuellen Speicher zugeordnet, kann jedoch einer Routine wie MapTransferEx- bereitgestellt werden, um eine DMA-Übertragung in oder aus den physischen Speicherbereichen zu initiieren, die von der MDL beschrieben werden. Rufen Sie die MmMapLockedPagesSpecifyCache Routine auf, um diese MDL einem zusammenhängenden Bereich virtueller Adressen zuzuordnen, damit sie vom Prozessor aufgerufen werden kann.

Nur Bereiche des physischen Adressraums, die nicht vom Betriebssystem für die Verwendung reserviert sind, da treiber für die Verwendung als E/A-Adressraum verfügbar sind. Treiber verwenden den E/A-Adressraum, um auf speicherzuordnunge Hardwareressourcen wie Geräteregister zuzugreifen. Wenn ein Treiber gestartet wird, empfängt er möglicherweise einen oder mehrere physische Adressbereiche als übersetzte Hardwareressourcen. Weitere Informationen finden Sie unter Zuordnung Bus-Relative Adressen zu virtuellen Adressen.

In einigen Prozessorarchitekturen, z. B. x86, können Geräte entweder speicherzuordnunget oder Portadressen in einem speziellen E/A-Adressbereich zugeordnet werden, der für Geräte reserviert ist und vom Speicheradressraum getrennt ist. Treiber können MmAllocateMdlForIoSpace- verwenden, um MDLs nur für speicherzuordnungsfähige Geräte zuzuweisen.

Beispiele

Das folgende Codebeispiel zeigt, wie Sie ein Array von MM_PHYSICAL_ADDRESS_LIST Strukturen erstellen, die die physischen Adressbereiche beschreiben, die in die zugeordnete MDL aufgenommen werden sollen.

extern ULONG64 BasePhysicalAddress;
extern SIZE_T ChunkSize;
extern SIZE_T Stride;

#define ARRAYSIZE(x)  (sizeof(x)/sizeof((x)[0]))
 
NTSTATUS Status;
PMDL Mdl;
MM_PHYSICAL_ADDRESS_LIST AddressList[3];
 
AddressList[0].PhysicalAddress.QuadPart = BasePhysicalAddress;
AddressList[0].NumberOfBytes = ChunkSize;
 
BasePhysicalAddress += Stride;
 
AddressList[1].PhysicalAddress.QuadPart = BasePhysicalAddress;
AddressList[1].NumberOfBytes = ChunkSize;
 
BasePhysicalAddress += Stride;
 
AddressList[2].PhysicalAddress.QuadPart = BasePhysicalAddress;
AddressList[2].NumberOfBytes = ChunkSize;
 
Status = MmAllocateMdlForIoSpace (AddressList, ARRAYSIZE(AddressList), &Mdl);

In diesem Beispiel wird die physische Startadresse durch die variable BasePhysicalAddress angegeben. Die Anzahl der Bytes in jedem physischen Adressbereich wird durch die variable ChunkSize angegeben. Der Byteoffset vom Anfang eines physischen Bereichs bis zum Anfang der nächsten wird durch die variable Stride angegeben. BasePhysicalAddress müssen an einer Seitengrenze im Arbeitsspeicher ausgerichtet werden, und ChunkSize und Stride müssen Vielfache der Seitengröße sein.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Verfügbar ab Windows 8.
Zielplattform- Universal
Header- wdm.h (include Wdm.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- <= DISPATCH_LEVEL

Siehe auch

IoFreeMdl-

MDL-

MM_PHYSICAL_ADDRESS_LIST

MapTransferEx-

MmMapLockedPagesSpecifyCache-