Condividi tramite


Allocazione di memoria System-Space

Importante

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

I driver possono usare lo 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 e maggiori 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 migliori da usare sono MmAllocateNonCachedMemory, MmAllocateContiguousMemorySpecifyCache, AllocateCommonBuffer (se il dispositivo del driver usa la modalità di inizializzazione automatica del controller DMA del bus o di un controller DMA di sistema) o ExAllocatePoolWithTag.

Il pool di memoria non paginata si frammenta tipicamente 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 al driver. Ognuna di queste routine, ad eccezione di ExAllocatePoolWithTag, alloca la memoria allineata a un limite specifico del processore (determinato dalle dimensioni della riga della cache dei dati del processore) per garantire prestazioni ottimali.

I driver devono allocare buffer di I/O in modo più efficiente possibile, perché la memoria del pool non di paging è 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 buffer del driver in termini economici

Per allocare economicamente la memoria del buffer di I/O, 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 di sistema non di paging, indipendentemente dalle dimensioni dell'allocazione richiesta. Pertanto, le richieste inferiori a una pagina intera vengono arrotondate a una pagina intera e tutti i byte rimanenti nella pagina vengono sprecati; sono inaccessibili dal driver che ha chiamato la funzione e sono inutilizzabili da altro codice in modalità kernel.

  • Ogni chiamata a AllocateCommonBuffer utilizza almeno un registro mappa dell'adattatore, che mappa almeno un byte e al massimo una pagina. Per altre informazioni sui registri delle mappe 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 qualsiasi oggetto o risorsa non archiviata 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 il valore NumberOfBytes specificato è minore o uguale a PAGE_SIZE. In caso contrario, tutti i byte rimanenti nell'ultima pagina allocata vengono sprecati: inaccessibili al chiamante e inutilizzabili da altri codici in modalità kernel.

    Ad esempio, in un x86, una richiesta di allocazione di 5 kilobyte (KB) restituisce due pagine da 4 KB. Gli ultimi 3 KB della seconda pagina non sono disponibili per il chiamante o un altro chiamante. Per evitare di sprecare pool senza pagine, il driver deve allocare in modo efficiente più pagine. 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 di byte richiesto. I driver devono sempre controllare il puntatore restituito. Se il valore è NULL, la routine DriverEntry (o qualsiasi altra routine del driver che restituisce valori NTSTATUS) deve restituire STATUS_INSUFFICIENT_RESOURCES o gestire la condizione di errore, se possibile.