Compartir a través de


Uso de Common-Buffer Bus-Master DMA

Como se describe en Uso de Bus-Master DMA, algunos controladores para dispositivos DMA maestros de bus usan DMA de búfer común exclusivamente y algunos usan DMA de búfer común en combinación con DMA basado en paquetes.

Use DMA de búfer común económicamente. La configuración de un búfer común puede asociar algunos (o todos, según el tamaño del búfer solicitado) de los registros de mapa asociados al objeto de adaptador que representa el adaptador de bus-master.

La configuración de áreas de búfer común económicamente, como el uso de fragmentos de PAGE_SIZE o una sola asignación, deja más registros de mapa disponibles para las operaciones DMA basadas en paquetes. También deja más memoria del sistema libre para otros propósitos, lo que produce un mejor rendimiento general del controlador y del sistema.

Para configurar un búfer común para DMA de bus-master, un controlador de dispositivo DMA de bus-master debe llamar a AllocateCommonBuffer con el puntero de objeto de adaptador devuelto por IoGetDmaAdapter. Normalmente, un controlador realiza esta llamada desde su rutina DispatchPnP para IRP_MN_START_DEVICE solicitudes. Un controlador solo debe asignar un búfer común si usará el búfer repetidamente para sus operaciones DMA mientras el controlador permanece cargado. En el diagrama siguiente se muestra una llamada de este tipo a AllocateCommonBuffer.

diagrama que ilustra la asignación de un búfer común para bus-master dma.

El tamaño solicitado para el búfer, que se muestra en el diagrama anterior como LengthForBuffer, determina cuántos registros de asignación se deben usar para proporcionar una asignación virtual a lógica para el búfer común. Use la macro BYTES_TO_PAGES para determinar el número máximo de páginas necesarias (BYTES_TO_PAGES (LengthForBuffer)). Este valor no puede ser mayor que los NumberOfMapRegisters devueltos por IoGetDmaAdapter.

Además, el autor de la llamada debe proporcionar lo siguiente:

  • Valor booleano que indica si se debe habilitar el almacenamiento en caché.

    Nota Este valor 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, se habilita la memoria almacenada en caché.

    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é.

  • Puntero a una variable definida por el controlador que contendrá la dirección lógica base accesible para el dispositivo para el búfer (BufferLogicalAddress en el diagrama anterior) devuelta desde AllocateCommonBuffer.

Si la llamada se realiza correctamente, AllocateCommonBuffer devuelve una dirección virtual base accesible para el controlador para el búfer (BufferVirtualAddress en el diagrama anterior), que el controlador debe guardar en su extensión del dispositivo, extensión del controlador u otro área de almacenamiento residente accesible para controladores (grupo no paginado asignado por el controlador).

AllocateCommonBuffer devuelve NULL si no puede asignar memoria para el búfer. Si la dirección virtual base devuelta es NULL, el controlador debe usar la compatibilidad con DMA basada en paquetes del sistema exclusivamente o el controlador debe producir un error en la solicitud de IRP_MN_START_DEVICE , devolviendo STATUS_INSUFFICIENT_RESOURCES.

De lo contrario, el controlador puede usar el búfer común asignado como área de almacenamiento accesible para controladores y adaptadores para transferencias DMA.

Cuando el administrador de PnP envía un IRP que detiene o quita el dispositivo, el controlador debe llamar a FreeCommonBuffer para liberar cada búfer común que haya asignado.