Condividi tramite


Uso dei buffer di memoria

I driver usano in genere buffer di memoria per passare dati da e verso il framework e altri driver o per archiviare le informazioni in locale. In questo argomento vengono descritti framework memory objects, lookaside lists, MDLse buffer locali.

Uso degli oggetti di memoria del framework

Il framework usa oggetti di memoria per descrivere i buffer di memoria che un driver riceve e passa al framework. Ogni oggetto memoria del framework rappresenta un buffer.

Per creare un oggetto memoria, il driver chiama uno dei metodi di oggetto seguenti:

Per ottenere un oggetto memoria che rappresenta i buffer di una richiesta di I/O ricevuta, il driver chiama WdfRequestRetrieveInputMemory e WdfRequestRetrieveOutputMemory. Per ulteriori informazioni sul recupero dei buffer di una richiesta di I/O, vedere Accesso ai buffer di dati nei driver Framework-Based.

Per ottenere l'indirizzo e le dimensioni del buffer di un oggetto memoria, il driver chiama WdfMemoryGetBuffer.

Per spostare i dati nel buffer di un oggetto memoria, il driver chiama WdfMemoryCopyFromBuffer o WdfMemoryCopyToBuffer. Questi metodi oggetto controllano le dimensioni di origine e di destinazione e impediscono errori di sovraccarico del buffer.

Se il driver crea un oggetto memoria chiamando WdfMemoryCreatePreallocated, può successivamente assegnare un buffer diverso all'oggetto memoria chiamando WdfMemoryAssignBuffer.

Quando un driver invia una richiesta di I/O a un I/O target, in genere passa un buffer di input o di output a un metodo di un oggetto di destinazione I/O del framework . Il driver specifica il buffer passando una struttura WDF_MEMORY_DESCRIPTOR che descrive il buffer o passando un handle di oggetto di memoria. I metodi dell'oggetto di destinazione I/O che inviano richieste di I/O in modo sincrono richiedono una struttura WDF_MEMORY_DESCRIPTOR e metodi che inviano richieste di I/O in modo asincrono richiedono un handle di oggetto memoria.

Per informazioni su quando un buffer di memoria è valido, vedere Ciclo di vita del buffer di memoria.

Uso degli elenchi Lookaside

Se il driver richiederà molti buffer di circa la stessa dimensione, dovrebbe allocarli da un elenco di lookaside . Il driver crea una lista lookaside chiamando WdfLookasideListCreate. Successivamente, il driver può ottenere buffer dall'elenco lookaside chiamando WdfMemoryCreateFromLookaside.

Ogni volta che il driver chiama WdfMemoryCreateFromLookaside, il framework crea un oggetto memoria, ottiene un buffer dall'elenco lookaside e assegna il buffer all'oggetto . Al termine dell'utilizzo di uno di questi oggetti di memoria, il driver chiama WdfObjectDelete, che elimina l'oggetto memoria e restituisce lo spazio del buffer all'elenco lookaside.

Il sistema operativo gestisce le risorse di memoria assegnate all'elenco lookaside. Se il driver richiede un buffer dall'elenco lookaside quando non ce ne sono disponibili, ad esempio per la prima volta in cui il driver chiama WdfMemoryCreateFromLookaside, il sistema alloca un buffer e lo assegna all'elenco. Quando il driver chiama WdfObjectDelete (e lo spazio del buffer viene restituito all'elenco lookaside), il sistema mantiene il buffer non assegnato nell'elenco finché il driver non lo richiede nuovamente. Il sistema aumenta le dimensioni dell'elenco in base alle esigenze; Ad esempio, i driver che più frequentemente richiedono buffer ricevono elenchi lookaside più grandi. D'altra parte, il sistema potrebbe ridurre il numero di buffer nell'elenco se il driver non li usa tutti.

Uso di MDLs

Alcuni driver usano elenchi di descrittori di memoria (MDLs) per descrivere i buffer. Ad esempio, un driver per un dispositivo DMA (Direct Memory Access) deve passare un MDL al metodo WdfDmaTransactionInitialize, se chiama tale metodo.

Un driver che utilizza MDLs può ottenere un MDL che rappresenta i buffer di una richiesta di I/O ricevuta chiamando WdfRequestRetrieveInputWdmMdl e WdfRequestRetrieveOutputWdmMdl.

La maggior parte dei driver basati su framework non utilizza MDLs.

Allocazione di Buffer Locali

Un driver che richiede spazio del buffer interno locale che non passerà al framework non deve creare oggetti di memoria per rappresentare i buffer. Il driver può chiamare ExAllocatePoolWithTag per allocare buffer interni. Al termine dell'uso del buffer, il driver deve chiamare ExFreePoolWithTag.

Tuttavia, i driver possono anche usare oggetti di memoria per i buffer locali. Un vantaggio dell'uso dei buffer di memoria, invece di chiamare ExAllocatePoolWithTag, è che il framework elimina automaticamente gli oggetti di memoria e i relativi buffer quando viene eliminato l'oggetto padre di ogni oggetto.

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.

Allineamento dei buffer

Il driver può usare la funzione WDF_ALIGN_SIZE_UP o WDF_ALIGN_SIZE_DOWN per calcolare una dimensione del buffer allineata a un offset di allineamento specificato. Questo calcolo è utile se il driver deve allocare più buffer contigui, se ogni buffer deve iniziare in corrispondenza di un limite di allineamento degli indirizzi.