Condividi tramite


Funzione MmAllocateMdlForIoSpace (wdm.h)

La routine MmAllocateMdlForIoSpace alloca un MDL e inizializza questo MDL per descrivere un set di intervalli di indirizzi fisici nello spazio indirizzi I/O.

Sintassi

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

Parametri

[in] PhysicalAddressList

Puntatore a una matrice di strutture MM_PHYSICAL_ADDRESS_LIST che descrivono gli intervalli di indirizzi fisici da includere nel file MDL allocato.

[in] NumberOfEntries

Numero di elementi nella matrice MM_PHYSICAL_ADDRESS_LIST a cui punta PhysicalAddressList.

[out] NewMdl

Puntatore a una posizione in cui la routine scrive un puntatore al file MDL appena allocato.

Valore restituito

MmAllocateMdlForIoSpace restituisce STATUS_SUCCESS se ha esito positivo. I valori restituiti di errore possibili includono i codici di stato seguenti.

Codice restituito Descrizione
STATUS_INVALID_PARAMETER_1 Un indirizzo fisico non è allineato a un limite di pagina; o un intervallo di indirizzi fisici non è un multiplo delle dimensioni della pagina; o un intervallo di indirizzi fisici viene usato dal sistema operativo per la RAM e non è disponibile per l'uso come spazio di I/O.
STATUS_INSUFFICIENT_RESOURCES Sono disponibili risorse di sistema insufficienti per eseguire l'operazione richiesta.

Non presupporre che l'elenco precedente di codici restituiti di errore sia esaustivo. La routine potrebbe restituire codici di errore che non vengono visualizzati nell'elenco.

Commenti

Questa routine accetta, come parametro di input, una matrice di strutture MM_PHYSICAL_ADDRESS_LIST che descrivono un set di intervalli di indirizzi fisici nello spazio di indirizzi I/O e alloca un MDL che descrive questi intervalli. Gli intervalli di indirizzi fisici consecutivi nella matrice non devono essere contigui.

Gli intervalli di indirizzi fisici nella matrice PhysicalAddressList devono soddisfare le condizioni seguenti:

  • L'indirizzo fisico di base per ogni intervallo deve essere allineato a un limite PAGE_SIZE in memoria.

  • Le dimensioni, in byte, di ogni intervallo devono essere un multiplo intero di PAGE_SIZE.

  • Tutti gli intervalli di indirizzi fisici devono essere in memoria che è disponibile per l'uso come spazio indirizzi di I/O. Non possono trovarsi nello spazio di memoria usato dal sistema operativo per la RAM.

  • Le dimensioni totali di tutti gli intervalli devono essere inferiori a 4 gigabyte. In particolare, le dimensioni totali non devono superare 2^32 - 1 byte.

Il chiamante è responsabile della liberazione del file MDL allocato quando non è più necessario. Per liberare il file MDL, chiamare la routine IoFreeMdl . Per altre informazioni sugli mdls, vedere Using MDLs.For more information about MDLs, see Using MDLs.

Il file MDL creato da MmAllocateMdlForIoSpace non è mappato alla memoria virtuale, ma può essere fornito a una routine come MapTransferEx per avviare un trasferimento DMA da o verso gli intervalli di memoria fisica descritti dal linguaggio MDL. Per eseguire il mapping di questo MDL a un intervallo contiguo di indirizzi virtuali in modo che sia accessibile dal processore, chiamare la routine MmMapLockedPagesSpecifyCache .

Solo gli intervalli dello spazio indirizzi fisico non riservati dal sistema operativo per l'uso come memoria sono disponibili per i driver da usare come spazio indirizzi di I/O. I driver usano lo spazio indirizzi di I/O per accedere alle risorse hardware mappate alla memoria, ad esempio i registri dei dispositivi. All'avvio di un driver, potrebbe ricevere uno o più intervalli di indirizzi fisici come risorse hardware tradotte. Per altre informazioni, vedere Mapping di indirizzi Bus-Relative a indirizzi virtuali.

In alcune architetture del processore, ad esempio x86, i dispositivi possono essere mappati alla memoria o mappati a indirizzi di porta in uno spazio indirizzi di I/O speciale dedicato ai dispositivi ed è separato dallo spazio indirizzi della memoria. I driver possono usare MmAllocateMdlForIoSpace per allocare mdls solo per i dispositivi mappati alla memoria.

Esempio

Nell'esempio di codice seguente viene illustrato come costruire una matrice di strutture MM_PHYSICAL_ADDRESS_LIST che descrivono gli intervalli di indirizzi fisici da includere nel file MDL allocato.

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 questo esempio l'indirizzo fisico iniziale viene specificato dalla BasePhysicalAddress variabile . Il numero di byte in ogni intervallo di indirizzi fisici viene specificato dalla ChunkSize variabile . L'offset di byte dall'inizio di un intervallo fisico all'inizio del successivo viene specificato dalla Stride variabile . BasePhysicalAddress deve essere allineato a un limite di pagina in memoria e ChunkSizeStride deve essere costituito da più dimensioni della pagina.

Requisiti

Requisito Valore
Client minimo supportato Disponibile a partire da Windows 8.
Piattaforma di destinazione Universale
Intestazione wdm.h (include Wdm.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

Vedi anche

IoFreeMdl

MDL

MM_PHYSICAL_ADDRESS_LIST

MapTransferEx

MmMapLockedPagesSpecifyCache