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 ChunkSize
Stride
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 |