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 |