Compartir a través de


PALLOCATE_COMMON_BUFFER función de devolución de llamada (wdm.h)

La AllocateCommonBuffer rutina asigna memoria y la asigna para que sea accesible simultáneamente desde el procesador y un dispositivo para las operaciones DMA.

Sintaxis

PALLOCATE_COMMON_BUFFER PallocateCommonBuffer;

PVOID PallocateCommonBuffer(
  [in]  PDMA_ADAPTER DmaAdapter,
  [in]  ULONG Length,
  [out] PPHYSICAL_ADDRESS LogicalAddress,
  [in]  BOOLEAN CacheEnabled
)
{...}

Parámetros

[in] DmaAdapter

Puntero a la estructura DMA_ADAPTER devuelta por ioGetDmaAdapter que representa el adaptador de bus-master o el controlador DMA.

[in] Length

Especifica el número de bytes de memoria que se van a asignar.

[out] LogicalAddress

Puntero a una variable que recibe la dirección lógica que el dispositivo puede usar para acceder al búfer asignado. Use esta dirección en lugar de llamar a MmGetPhysicalAddress porque el sistema puede tener en cuenta las restricciones de memoria específicas de la plataforma.

[in] CacheEnabled

Especifica si la memoria asignada se puede almacenar en caché.

Este parámetro se omite. El sistema operativo determina si se va a habilitar la memoria almacenada en caché en el búfer común que se va a asignar. Esa decisión se basa en la arquitectura del procesador y el bus de dispositivo.

En equipos con procesadores basados en x86, basados en x64 y basados en Itanium, la memoria almacenada en caché está habilitada. Se supone que todas las operaciones de DMA realizadas por un dispositivo son coherentes con las memorias caché de CPU pertinentes, que podrían estar almacenando en caché esa memoria. Si el controlador necesita deshabilitar el almacenamiento en caché, llame a AllocateCommonBufferEx en su lugar.

En equipos con procesadores basados en ARM o ARM 64, el sistema operativo no habilita automáticamente la memoria almacenada en caché para todos los dispositivos. El sistema se basa en el método ACPI_CCA para cada dispositivo para determinar si el dispositivo es coherente con la memoria caché.

Valor devuelto

AllocateCommonBuffer devuelve la dirección virtual base del intervalo asignado. Si no se puede asignar el búfer, devuelve NULL.

Observaciones

allocateCommonBuffer no es una rutina del sistema a la que se puede llamar directamente por nombre. Esta rutina solo se puede llamar por puntero de la dirección devuelta en una estructura de DMA_OPERATIONS. Los controladores obtienen la dirección de esta rutina llamando a IoGetDmaAdapter.

AllocateCommonBuffer admite DMA en el que el dispositivo y el procesador se comunican continuamente a través de la memoria del sistema, como en una estructura de control para un dispositivo DMA maestro de bus.

AllocateCommonBuffer también admite dispositivos subordinados cuyos controladores usan el modo de inicialización automática de un controlador DMA del sistema.

AllocateCommonBuffer hace lo siguiente:

  • Asigna memoria que se puede acceder desde el procesador y el dispositivo. Esta memoria aparece contigua al dispositivo.
  • Asigna registros de mapa para asignar el búfer, si es necesario por el sistema.
  • Configura una traducción para el dispositivo, incluida la carga de registros de mapa si es necesario.
Para usar la memoria del sistema residente económicamente, los controladores deben asignar tan pocos de estos búferes por dispositivo como sea posible. AllocateCommonBuffer asigna al menos una página de memoria, independientemente de la longitud solicitada. Después de una asignación correcta que solicita menos de PAGE_SIZE bytes, el autor de la llamada solo puede acceder a la longitud solicitada. Después de una asignación correcta que solicita más de un múltiplo entero de PAGE_SIZE bytes, los bytes restantes de la última página asignada son inaccesibles para el autor de la llamada.

Si un controlador necesita varias páginas de espacio de búfer común, pero las páginas no deben ser contiguas, el controlador debe realizar varias solicitudes de una página para AllocateCommonBuffer en lugar de una solicitud grande. Este enfoque conserva la memoria contigua.

Normalmente, los controladores llaman a AllocateCommonBuffer como parte del inicio del dispositivo, durante su respuesta a una solicitud de IRP_MN_START_DEVICE PnP. Después del inicio, es posible que solo las solicitudes de una página se realicen correctamente, si las hay.

Requisitos

Requisito Valor
cliente mínimo admitido Disponible a partir de Windows 2000.
de la plataforma de destino de Escritorio
encabezado de wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
irQL PASSIVE_LEVEL
reglas de cumplimiento de DDI irqlDispatch(wdm)

Consulte también

DMA_ADAPTER

DMA_OPERATIONS

FreeCommonBuffer

IoGetDmaAdapter