# Acceso directo a memoria

El acceso directo a memoria (DMA, del inglés direct memory access) permite a cierto tipo de componentes de una computadora acceder a la memoria del sistema para leer o escribir independientemente de la unidad central de procesamiento (CPU). Muchos sistemas hardware utilizan DMA, incluyendo controladores de unidades de disco, tarjetas gráficas y tarjetas de sonido. DMA es una característica esencial en todos los ordenadores modernos, ya que permite a dispositivos de diferentes velocidades comunicarse sin someter a la CPU a una carga masiva de interrupciones.
Una transferencia DMA consiste principalmente en copiar un bloque de memoria de un dispositivo a otro. En lugar de que la CPU inicie la transferencia, esta se lleva a cabo por el controlador DMA. Un ejemplo típico es mover un bloque de memoria desde una memoria externa a una interna más rápida. Tal operación no ocupa al procesador y, por ende, este puede efectuar otras tareas. Las transferencias DMA son esenciales para aumentar el rendimiento de aplicaciones que requieran muchos recursos.
Cabe destacar que aunque no se necesite a la CPU para la transacción de datos, sí se necesita el bus del sistema (tanto bus de datos como bus de direcciones), por lo que existen diferentes estrategias para regular su uso, permitiendo así que no quede totalmente acaparado por el controlador DMA.

## Problemas de coherencia en la memoria caché del procesador

La DMA puede llevar a problemas de coherencia de caché del procesador. Imagine una CPU equipada con una memoria caché y una memoria externa que se pueda acceder directamente por los dispositivos que utilizan DMA. Cuando la CPU accede a X lugar en la memoria externa, el valor actual se almacena en la caché. Si se realizan operaciones posteriores en X, se actualizará la copia en caché de X, pero no la versión de memoria externa de X. Si la caché no se vacía en la memoria externa antes de que otro dispositivo intente acceder a X, el dispositivo recibirá un valor caducado de X.
Del mismo modo, si la copia en caché de X no es invalidada cuando un dispositivo escribe un nuevo valor en la memoria externa, entonces la CPU funcionará con un valor caducado de X.
Este problema puede ser abordado en el diseño del sistema de las siguientes dos formas:
* Los sistemas de caché coherente implementan un método en el hardware externo mediante el cual se escribe una señal en el controlador de caché, la cual realiza una invalidación de la caché para escritura de DMA, o realiza una descarga de caché en la memoria externa para lectura de DMA.
* Los sistemas no-coherente, donde el sistema operativo debe asegurarse de que la caché sea vaciada en la memoria externa antes de que una transferencia de salida de DMA sea iniciada, o sea anulada antes de que una parte de la memoria externa sea afectada por una transferencia entrante de DMA que se haya requerido. El sistema operativo debe asegurarse de que esa parte de memoria no es accedida por cualquier subproceso que se ejecute en ese instante. Este último enfoque introduce cierta sobrecarga a la operación de DMA, ya que la mayoría de hardware requiere un bucle para invalidar cada línea de caché de forma individual.
Los híbridos también existen, donde la caché secundaria L2 es coherente, mientras que la caché L1 (generalmente la CPU) es gestionada por el software.

## Secuencia de eventos

Una operación de E/S por DMA se establece ejecutando una corta rutina de inicialización. Consiste en varias instrucciones de salida para asignar valores iniciales a:
* AR: Dirección de memoria de la región de datos de E/S IOBUF (buffer de entrada/salida).
* WC: Número N de palabras de datos a transferir.
Una vez inicializado, el DMA procede a transferir datos entre IOBUF y el dispositivo de E/S. Se realiza una transferencia cuando el dispositivo de E/S solicite una operación de DMA a través de la línea de petición del DMAC.
Después de cada transferencia, se decrementa el valor de WC y se incrementa el de AR.
La operación termina cuando WC=0, entonces el DMAC (o el periférico) indica la conclusión de la operación enviando al procesador una petición de interrupción.

### Secuencia de eventos detallada

* El procesador inicializa el DMAC programando AR y WC.
* El dispositivo de E/S realiza una petición de DMA al DMAC.
* El DMAC le responde con una señal de aceptación.
* El DMAC activa la línea de petición de DMA al procesador.
* Al final del ciclo del bus en curso, el procesador pone las líneas del bus del sistema en alta impedancia y activa la sesión de DMA.
* El DMAC asume el control del bus.
* El dispositivo de E/S transmite una nueva palabra de datos al registro intermedio de datos del DMAC.
* El DMAC ejecuta un ciclo de escritura en memoria para transferir el contenido del registro intermedio a la posición M[AR].
* El DMAC decrementa WC e incrementa AR.
* El DMAC libera el bus y desactiva la línea de petición de DMA.
* El DMAC compara WC con 0:
* Si WC > 0, se repite desde el paso 2.
* Si WC = 0, el DMAC se detiene y envía una petición de interrupción al procesador.

## Motor de acceso directo a memoria

Además de la interacción de hardware, el acceso directo a memoria puede ser utilizado para descargar costosas operaciones de memoria, tales como copias de gran tamaño u operaciones de dispersión-reunión, desde la CPU a un motor de acceso directo a memoria dedicada. Intel incluye estos motores en los servidores de gama alta, llamado I/O Acceleration Technology (IOAT)..

## Transferencias

Durante las operaciones del DMA, el rendimiento del sistema puede verse afectado debido a que este dispositivo hace un uso intensivo del bus y por lo tanto la cpu no puede leer datos de memoria, por ejemplo para leer la siguiente instrucción a ejecutar. Esto provoca que mientras el DMA está operando, la cpu deba esperar a que finalice dicha tarea sin ejecutar ninguna instrucción. Para solventar esto, existe una memoria caché dentro de la CPU que permite a ésta seguir trabajando mientras el DMA mantiene ocupado el bus.
En computadores que no disponen de memoria caché, el DMA debe realizar su tarea evitando ocupar el bus de datos mientras la CPU realiza la fase de captación de la instrucción. A partir de estas dos posibilidades, existen dos tipos de transferencias de datos del DMA:

### Transferencias modo ráfaga

    Una vez que la CPU concede el bus al DMA, este no lo libera hasta que finaliza su tarea completamente.
Este tipo de transferencia se usa en sistemas que disponen de una memoria caché en la unidad de procesamiento, ya que mientras la CPU puede seguir trabajando utilizando la caché.

### Transferencias modo robo de ciclo

    Una vez que la CPU concede el bus al DMA, este lo vuelve a liberar al finalizar de transferir cada palabra. Teniendo que solicitar de nuevo el permiso de uso del bus a la CPU. Esta operación se repite hasta que el DMA finaliza la tarea. Este tipo de transferencia se suele usar en sistema que no disponen de memoria caché en la unidad de procesamiento, ya que de este modo, aunque la transferencia de datos tarda más en realizarse, la CPU puede seguir ejecutando instrucciones.

## Ejemplos
### ISA

Por ejemplo, un PC con arquitectura ISA con controlador de DMA basado en el Intel 8237, el cual es un controlador de DMA multimodo, que es una combinación de hardware-software. En los IBM antiguos, sólo había un controlador DMA capaz de ofrecer cuatro canales DMA (numerados 0-3). Estos canales DMA realizan las transferencias de 8 bits y sólo pueden dirigirse al primer megabyte de RAM. Con la IBM PC/AT, un segundo controlador de DMA 8237, fue añadido (canales 5-7; el canal 4 no se puede utilizar), y el registro página fue recableado para abordar la completa memoria de 16 MB de espacio de direcciones de la CPU 80286. Este segundo controlador realiza las transferencias de 16 bits.
Debido a su desempeño rezagado (2,5 Mbit / s [1]), estos dispositivos están dejando de ser utilizados desde la aparición del procesador 80386 y su capacidad de transferencia de 32 bits. Aún son admitidas en la medida en que son necesarias para apoyar incorporaciones hardware en las máquinas modernas.
Cada canal de DMA tiene un registro de dirección de 16-bit y un recuento de 16-bit del registro asociado a él. Para iniciar una transferencia de datos el controlador de dispositivo establece la dirección del canal de acceso directo a memoria y registros, los cuales contarán conjuntamente con la dirección de la transferencia de datos, leer o escribir. A continuación, indica al DMA para iniciar la transferencia. Cuando la transferencia se haya completado, el dispositivo interrumpe la CPU.
Es equivalente a la de encadenar múltiples peticiones simples del DMA. La motivación es la carga de múltiples entradas y salidas de interrupción y copiar los datos de las tareas de la CPU.
DRQ representa petición DMA ; DACK para reconocer DMA . Estos símbolos, visto en el hardware esquemas de los sistemas informáticos con funciones DMA, representan las líneas de señalización electrónica entre la CPU y el controlador DMA. Cada canal de DMA tiene una solicitud y una línea de reconocer. Un dispositivo correctamente configurado que utiliza DMA debe ser puenteado para utilizar las dos líneas del canal DMA asignado.
Norma ISA de asignaciones DMA:
    0 Refrescar DRAM (obsoleto),
    1 Usar hardware,
    2 Disquete controlador,
    3 Disco duro (obsoleto),
    4 XT Cascada del controlador DMA,
    5 Disco duro ( PS/2 solamente), hardware del usuario para todos los demás
    6 Usuario del hardware.

### PCI

Como se mencionó anteriormente, un PC con arquitectura PCI no tiene ningún controlador central de DMA, a diferencia del ISA. Por el contrario, cualquiera de los componentes PCI puede pedir el control del bus ("convertirse en el bus maestro") y pedir leer y escribir desde la memoria del sistema. Más precisamente, un componente de peticiones PCI tiene la propiedad de autobús desde el controlador de bus PCI, y arbitrar si la petición de varios dispositivos al mismo tiempo la propiedad de autobuses, ya que sólo puede haber un maestro de bus al mismo tiempo. Cuando el componente concede la propiedad, se leerán y escribirán comandos en el bus PCI, que se solicite por el controlador del bus y se remitirá al controlador de memoria usando un esquema que es específico de cada chipset.
Como puede verse, hay un buen número de pasos necesarios para una transferencia DMA, sin embargo, plantea muchos problemas, ya que el dispositivo PCI o bus PCI sí son más lentos que el resto de componentes.
Un moderno procesador x86 puede usar más de 4 GB de memoria, utilizando PAE, un modo de direccionamiento de 36 bits. En tal caso, un dispositivo que utiliza DMA con un poco de dirección de bus-32 es incapaz de tener una dirección de memoria por encima de la línea 4 GB. El nuevo ciclo de doble dirección (DAC), si se aplican tanto en el bus PCI y el propio dispositivo, permite el acceso directo de memoria de 64-bit de direccionamiento. De lo contrario, el sistema operativo tendría que solucionar el problema, ya sea usando costosos amortiguadores dobles (nomenclatura de Windows), también conocido como amortiguadores rebote (Linux), o puede utilizar un IOMMU para proporcionar servicios de traducción de direcciones, si uno está presente.

### AHB

En sistemas integrados en chips y en sistemas embebidos, la típica estructura de bus es un complejo bus integrado tal como el AMBA, de alto rendimiento. AMBA define dos tipos de componentes AHB: maestro y esclavo.
Una interfaz de esclavo es similar a la entrada/salida programada por software, que puede leer/escribir en registros de entrada/salida o (menos común) bloques locales de memoria dentro del dispositivo.
Una interfaz máster puede ser usada por el dispositivo para mejorar las transacciones del DMA hacia la memoria del sistema sin ralentizar a la CPU.
Por tanto dispositivos de un alto ancho de banda como los controladores de redes que necesitan transferir grandes cantidades de datos desde/hacia la memoria del sistema, tendrán dos adaptadores de interfaz hacia el bus AHB, una interfaz para máster y otra para esclavo. Esto es porque los buses integrados como el AHB no soportan el triestado en el bus.
En el caso del PCI, por ejemplo, no se necesita un controlador DMA central desde que los buses del DMA siguen una interfaz de maestro, pero se necesita de un circuito que gestione los casos en que haya varios buses máster presentes en el sistema.
Internamente, en los dispositivos existe un motor multicanal DMA controlar los casos de concurrencia.

### Acelerador de entrada y salida en Xeon

Como ejemplo de desarrollos de DMA incorporados a procesadores de propósito general, destacan los nuevos conjuntos de chips Intel Xeon que incluyen la nueva tecnología de DMA denominada I/O Acceleration Technology (I/OAT), destinada a mejorar el desarrollo de las redes con interfaces de red de altas prestaciones como por ejemplo la red Gigabit Ethernet, sin embargo en varios benchmarks se ha demostrado una mejora de no más del 10%.