Allocazione della memoria System-Space

Importante

Le DDI exAllocatePool descritte in questo argomento sono state deprecate in Windows 10, versione 2004 e sono state sostituite da ExAllocatePool2 e ExAllocatePool3. Per altre informazioni, vedere Aggiornamento delle chiamate ExAllocatePool deprecatePool2 e ExAllocatePool3.

I driver possono usare spazio allocato dal sistema all'interno delle estensioni del dispositivo come aree di archiviazione globali per informazioni specifiche del dispositivo. I driver possono usare solo lo stack del kernel per passare piccole quantità di dati alle routine interne. Alcuni driver devono allocare quantità aggiuntive di memoria dello spazio di sistema, in genere per i buffer di I/O.

Per allocare spazio buffer I/O, le routine di allocazione di memoria consigliate da usare sono MmAllocateNonCachedMemory, MmAllocateContiguousMemorySpecifyCache, AllocateCommonBuffer (se il dispositivo del driver usa la modalità DMA master del bus o una modalità di inizializzazione automatica del controller DMA del sistema) o ExAllocatePoolWithTag.

Il pool non a pagine viene in genere frammentato durante l'esecuzione del sistema, quindi la routine DriverEntry di un driver deve chiamare queste routine per configurare eventuali buffer di I/O a lungo termine necessari per il driver. Ognuna di queste routine, ad eccezione di ExAllocatePoolWithTag, alloca memoria allineata a un limite specifico del processore (determinato dalle dimensioni della riga della cache dei dati del processore) per offrire prestazioni ottimali.

I driver devono allocare i buffer di I/O il più economicamente possibile, perché la memoria del pool non a pagine è una risorsa di sistema limitata. In genere, un driver deve evitare di chiamare ripetutamente queste routine di supporto per richiedere allocazioni di meno di PAGE_SIZE perché ogni allocazione minore di PAGE_SIZE include anche un'intestazione del pool usata per gestire internamente l'allocazione.

Suggerimenti per l'allocazione dello spazio del buffer driver economicamente

Per allocare la memoria buffer di I/O in modo economico, tenere presente quanto segue:

  • Ogni chiamata a MmAllocateNonCachedMemory o MmAllocateContiguousMemorySpecifyCache restituisce sempre un multiplo completo delle dimensioni della pagina del sistema, della memoria dello spazio del sistema non impaginato, indipendentemente dalle dimensioni dell'allocazione richiesta. Pertanto, le richieste per meno di una pagina vengono arrotondate a una pagina completa e tutti i byte rimanenti nella pagina vengono sprecate; sono inaccessibili dal driver che ha chiamato la funzione e sono inutilizzabili da altri codice in modalità kernel.

  • Ogni chiamata a AllocateCommonBuffer usa almeno un registro mappa oggetti adapter, che esegue il mapping di almeno un byte e alla maggior parte di una pagina. Per altre informazioni sui registri mappa e sull'uso di buffer comuni, vedere Oggetti adapter e DMA.

Allocazione della memoria con ExAllocatePoolWithTag

I driver possono anche chiamare ExAllocatePoolWithTag, specificando uno dei valori di POOL_TYPE definiti dal sistema seguenti per il parametro PoolType :

  • PoolType = NonPagedPool per tutti gli oggetti o le risorse non archiviati in un'estensione del dispositivo o in un'estensione del controller a cui il driver può accedere durante l'esecuzione in IRQL > APC_LEVEL.

    Per questo valore PoolType , ExAllocatePoolWithTag alloca la quantità di memoria richiesta se l'oggetto NumberOfBytes specificato è minore o uguale a PAGE_SIZE. In caso contrario, tutti i byte rimanenti nell'ultima pagina allocata vengono sprecati: inaccessibile al chiamante e non utilizzabile da altro codice in modalità kernel.

    Ad esempio, in un x86, una richiesta di allocazione di 5 kilobyte (KB) restituisce due pagine da 4 KB. L'ultima 3 KB della seconda pagina non è disponibile per il chiamante o un altro chiamante. Per evitare la presenza di pool non di pagina, il driver deve allocare più pagine in modo efficiente. In questo caso, ad esempio, il driver potrebbe effettuare due allocazioni, una per PAGE_SIZE e l'altra per 1 KB, per allocare un totale di 5 KB.

    Nota A partire da Windows Vista, il sistema aggiunge automaticamente la memoria aggiuntiva in modo che due allocazioni non siano necessarie.

  • PoolType = PagedPool per la memoria a cui si accede sempre in IRQL <= APC_LEVEL e non si trova nel percorso di scrittura del file system.

ExAllocatePoolWithTag restituisce un puntatore NULL se non è in grado di allocare il numero richiesto di byte. I driver devono sempre controllare il puntatore restituito. Se il valore è NULL, la routine DriverEntry (o qualsiasi altra routine driver che restituisce valori NTSTATUS) deve restituire STATUS_INSUFFICIENT_RESOURCES o gestire la condizione di errore se possibile.