El acceso directo a memoria ( DMA ) es una característica de los sistemas informáticos que permite que ciertos subsistemas de hardware accedan a la memoria principal del sistema independientemente de la unidad central de procesamiento (CPU). [1]
Sin DMA, cuando la CPU está utilizando la entrada/salida programada , normalmente está completamente ocupada durante toda la duración de la operación de lectura o escritura y, por lo tanto, no está disponible para realizar otro trabajo. Con DMA, la CPU primero inicia la transferencia, luego realiza otras operaciones mientras la transferencia está en progreso y, finalmente, recibe una interrupción del controlador DMA (DMAC) cuando la operación está terminada. Esta característica es útil en cualquier momento en que la CPU no pueda mantener el ritmo de transferencia de datos, o cuando la CPU necesita realizar un trabajo mientras espera una transferencia de datos de E/S relativamente lenta. Muchos sistemas de hardware utilizan DMA, incluidos los controladores de unidades de disco , tarjetas gráficas , tarjetas de red y tarjetas de sonido . DMA también se utiliza para la transferencia de datos dentro del chip en algunos procesadores multinúcleo . Las computadoras que tienen canales DMA pueden transferir datos hacia y desde dispositivos con mucha menos sobrecarga de CPU que las computadoras sin canales DMA. De manera similar, un circuito de procesamiento dentro de un procesador multinúcleo puede transferir datos hacia y desde su memoria local sin ocupar su tiempo de procesador, lo que permite que el cálculo y la transferencia de datos se realicen en paralelo.
El DMA también se puede utilizar para copiar o mover datos de "memoria a memoria" dentro de la memoria. El DMA puede descargar operaciones de memoria costosas, como copias grandes u operaciones de dispersión y recolección , desde la CPU a un motor DMA dedicado. Un ejemplo de implementación es la tecnología de aceleración de E/S . El DMA es de interés en arquitecturas informáticas de red en chip y en memoria .
El DMA estándar, también llamado DMA de terceros, utiliza un controlador DMA. Un controlador DMA puede generar direcciones de memoria e iniciar ciclos de lectura o escritura de memoria. Contiene varios registros de hardware que la CPU puede escribir y leer. Estos incluyen un registro de dirección de memoria, un registro de conteo de bytes y uno o más registros de control. Dependiendo de las características que proporcione el controlador DMA, estos registros de control pueden especificar alguna combinación de la fuente, el destino, la dirección de la transferencia (lectura desde el dispositivo de E/S o escritura en el dispositivo de E/S), el tamaño de la unidad de transferencia y/o la cantidad de bytes a transferir en una ráfaga. [2]
Para llevar a cabo una operación de entrada, salida o de memoria a memoria, el procesador anfitrión inicializa el controlador DMA con un recuento de la cantidad de palabras a transferir y la dirección de memoria a utilizar. Luego, la CPU ordena al dispositivo periférico que inicie una transferencia de datos. Luego, el controlador DMA proporciona direcciones y líneas de control de lectura/escritura a la memoria del sistema. Cada vez que un byte de datos está listo para ser transferido entre el dispositivo periférico y la memoria, el controlador DMA incrementa su registro de dirección interno hasta que se transfiere el bloque completo de datos.
Algunos ejemplos de buses que utilizan DMA de terceros son PATA , USB (antes de USB4 ) y SATA ; sin embargo, sus controladores host utilizan bus mastering . [ cita requerida ]
En un sistema de masterización de bus , también conocido como sistema DMA de primera parte, se puede otorgar a la CPU y a los periféricos el control del bus de memoria. Cuando un periférico puede convertirse en maestro de bus, puede escribir directamente en la memoria del sistema sin la intervención de la CPU, proporcionando direcciones de memoria y señales de control según sea necesario. Se deben proporcionar algunas medidas para poner al procesador en una condición de espera para que no se produzca una contención del bus.
En el modo de ráfaga , se transfiere un bloque completo de datos en una secuencia contigua. Una vez que la CPU concede acceso al bus del sistema al controlador DMA, este transfiere todos los bytes de datos del bloque de datos antes de devolver el control de los buses del sistema a la CPU, pero deja a la CPU inactiva durante períodos de tiempo relativamente largos. Este modo también se denomina "modo de transferencia de bloques".
El modo de robo de ciclo se utiliza en sistemas en los que la CPU no debe desactivarse durante el tiempo necesario para los modos de transferencia en ráfaga. En el modo de robo de ciclo, el controlador DMA obtiene acceso al bus del sistema de la misma manera que en el modo ráfaga, utilizando señales BR ( Bus Request ) y BG ( Bus Grant ) , que son las dos señales que controlan la interfaz entre la CPU y el controlador DMA. Sin embargo, en el modo de robo de ciclo, después de una unidad de transferencia de datos, el control del bus del sistema se desautoriza a la CPU a través de BG. Luego se solicita nuevamente de forma continua a través de BR, transfiriendo una unidad de datos por solicitud, hasta que se haya transferido todo el bloque de datos. [3] Al obtener y liberar continuamente el control del bus del sistema, el controlador DMA esencialmente intercala transferencias de instrucciones y datos. La CPU procesa una instrucción, luego el controlador DMA transfiere un valor de datos, y así sucesivamente. Los datos no se transfieren tan rápidamente, pero la CPU no está inactiva durante tanto tiempo como en el modo ráfaga. El modo de robo de ciclo es útil para los controladores que monitorean datos en tiempo real.
El modo transparente es el que más tiempo lleva transferir un bloque de datos, pero también es el modo más eficiente en términos de rendimiento general del sistema. En el modo transparente, el controlador DMA transfiere datos solo cuando la CPU está realizando operaciones que no utilizan los buses del sistema. La principal ventaja del modo transparente es que la CPU nunca deja de ejecutar sus programas y la transferencia DMA es gratuita en términos de tiempo, mientras que la desventaja es que el hardware necesita determinar cuándo la CPU no está utilizando los buses del sistema, lo que puede ser complejo. Esto también se denomina " modo de transferencia de datos DMA oculto ".
El DMA puede provocar problemas de coherencia de la memoria caché . Imagine una CPU equipada con una memoria caché y una memoria externa a la que pueden acceder directamente los dispositivos que utilizan DMA. Cuando la CPU accede a la ubicación X en la memoria, el valor actual se almacenará en la memoria caché. Las operaciones posteriores en X actualizarán la copia en caché de X, pero no la versión de memoria externa de X, suponiendo que se trata de una memoria caché de escritura diferida . Si la memoria caché no se vacía en la memoria antes de la próxima vez que un dispositivo intente acceder a X, el dispositivo recibirá un valor obsoleto de X.
De manera similar, si la copia en caché de X no se invalida cuando un dispositivo escribe un nuevo valor en la memoria, entonces la CPU operará con un valor obsoleto de X.
Este problema se puede abordar de una de dos maneras en el diseño del sistema: los sistemas coherentes con la caché implementan un método en hardware, llamado " bus snooping" , mediante el cual las escrituras externas se envían al controlador de caché, que luego realiza una invalidación de caché para escrituras DMA o un vaciado de caché para lecturas DMA. Los sistemas no coherentes dejan esto en manos del software, donde el sistema operativo debe asegurarse de que las líneas de caché se vacíen antes de que se inicie una transferencia DMA saliente y se invaliden antes de que se acceda a un rango de memoria afectado por una transferencia DMA entrante. El sistema operativo debe asegurarse de que ningún subproceso en ejecución acceda al rango de memoria mientras tanto. El último enfoque introduce cierta sobrecarga en la operación DMA, ya que la mayoría del hardware requiere un bucle para invalidar cada línea de caché individualmente.
También existen híbridos, donde el caché L2 secundario es coherente mientras que el caché L1 (normalmente en la CPU) es gestionado por software.
En el IBM PC original (y el PC/XT posterior ), solo había un controlador DMA Intel 8237 capaz de proporcionar cuatro canales DMA (numerados del 0 al 3). Estos canales DMA realizaban transferencias de 8 bits (ya que el 8237 era un dispositivo de 8 bits, idealmente adaptado a la arquitectura de bus/CPU i8088 del PC), solo podían direccionar el primer megabyte (estándar i8086 /8088) de RAM y estaban limitados a direccionar segmentos individuales de 64 kB dentro de ese espacio (aunque los canales de origen y destino podían direccionar segmentos diferentes). Además, el controlador solo se podía usar para transferencias hacia, desde o entre dispositivos de E/S de bus de expansión, ya que el 8237 solo podía realizar transferencias de memoria a memoria utilizando los canales 0 y 1, de los cuales el canal 0 en el PC (y XT) estaba dedicado a la actualización dinámica de la memoria . Esto impedía que se utilizara como un " Blitter " de propósito general y, en consecuencia, los movimientos de memoria de bloque en la PC, limitados por la velocidad PIO general de la CPU, eran muy lentos.
Con el IBM PC/AT , el bus AT mejorado (más conocido como Industry Standard Architecture (ISA)) agregó un segundo controlador DMA 8237 para proporcionar tres canales adicionales (5-7; el canal 4 se usa como una cascada para el primer 8237), como se destacó por los conflictos de recursos con la capacidad de expansión adicional del XT sobre el PC original. El registro de página también se recableó para abordar el espacio de dirección de memoria completo de 16 MB de la CPU 80286. Este segundo controlador también se integró de una manera capaz de realizar transferencias de 16 bits cuando se usa un dispositivo de E/S como fuente y/o destino de datos (ya que en realidad solo procesa datos por sí mismo para transferencias de memoria a memoria, de lo contrario simplemente controla el flujo de datos entre otras partes del sistema de 16 bits, lo que hace que su propio ancho de bus de datos sea relativamente inmaterial), duplicando el rendimiento de datos cuando se usan los tres canales superiores. Para compatibilidad, los cuatro canales DMA inferiores todavía estaban limitados a transferencias de 8 bits únicamente, y mientras que Las transferencias de memoria a memoria eran ahora técnicamente posibles debido a la liberación del canal 0 de tener que manejar la actualización de DRAM, desde un punto de vista práctico eran de valor limitado debido al bajo rendimiento consecuente del controlador en comparación con lo que la CPU podía lograr ahora (es decir, un 80286 de 16 bits, más optimizado , funcionando a un mínimo de 6 MHz, frente a un controlador de 8 bits bloqueado a 4,77 MHz). En ambos casos, el problema del límite de segmento de 64 kB permaneció, con transferencias individuales incapaces de cruzar segmentos (en lugar de eso, "enrollándose" hasta el comienzo del mismo segmento) incluso en modo de 16 bits, aunque esto era en la práctica más un problema de complejidad de programación que de rendimiento, ya que la necesidad continua de actualización de DRAM (independientemente de cómo se manejara) para monopolizar el bus aproximadamente cada 15 μs impedía el uso de transferencias de bloques grandes (y rápidas, pero ininterrumpibles).
Debido a su rendimiento lento ( capacidad máxima de transferencia de 8 bits de 1,6 MB /s a 5 MHz, [4] pero no más de 0,9 MB/s en el PC/XT y 1,6 MB/s para transferencias de 16 bits en el AT debido a sobrecargas de bus ISA y otras interferencias como interrupciones de actualización de memoria [1] ) y la falta de disponibilidad de grados de velocidad que permitan la instalación de reemplazos directos que funcionen a velocidades superiores al reloj estándar de 4,77 MHz del PC original, estos dispositivos han quedado efectivamente obsoletos desde finales de los años 1980. En particular, la llegada del procesador 80386 en 1985 y su capacidad para transferencias de 32 bits (aunque las grandes mejoras en la eficiencia del cálculo de direcciones y los movimientos de memoria de bloque en las CPU de Intel después del 80186 significaron que las transferencias PIO incluso por parte del bus de 16 bits 286 y 386SX aún podían superar fácilmente al 8237), así como el desarrollo de posteriores evoluciones para ( EISA ) o reemplazos para ( MCA , VLB y PCI ) el bus "ISA" con sus propios subsistemas DMA de mucho mayor rendimiento (hasta un máximo de 33 MB/s para EISA, 40 MB/s para MCA, típicamente 133 MB/s para VLB/PCI) hicieron que los controladores DMA originales parecieran más un obstáculo al rendimiento que un refuerzo. Se les dio soporte en la medida en que se requirió para soportar hardware de PC heredado integrado en máquinas posteriores. Las piezas de hardware heredado que continuaron utilizando ISA DMA después de que los buses de expansión de 32 bits se volvieran comunes fueron las tarjetas Sound Blaster que necesitaban mantener una compatibilidad total del hardware con el estándar Sound Blaster; y los dispositivos Super I/O en placas base que a menudo integraban un controlador de disquete incorporado , un controlador de infrarrojos IrDA cuando se selecciona el modo FIR (infrarrojo rápido) y un controlador de puerto paralelo IEEE 1284 cuando se selecciona el modo ECP. En los casos en los que todavía se usaban 8237 originales o compatibles directos, la transferencia hacia o desde estos dispositivos aún puede estar limitada a los primeros 16 MB de RAM principal independientemente del espacio de direcciones real del sistema o la cantidad de memoria instalada.
Cada canal DMA tiene un registro de dirección de 16 bits y un registro de conteo de 16 bits asociado. Para iniciar una transferencia de datos, el controlador del dispositivo configura los registros de dirección y conteo del canal DMA junto con la dirección de la transferencia de datos, lectura o escritura. Luego, le indica al hardware DMA que comience la transferencia. Cuando se completa la transferencia, el dispositivo interrumpe la CPU.
La DMA de E/S vectorizada o de dispersión y reunión permite la transferencia de datos hacia y desde múltiples áreas de memoria en una única transacción DMA. Es equivalente a encadenar varias solicitudes DMA simples. La motivación es descargar de la CPU múltiples tareas de interrupción de entrada/salida y copia de datos.
DRQ significa Solicitud de datos (Data request ) y DACK significa Confirmación de datos (Data recall) . Estos símbolos, que aparecen en los esquemas de hardware de los sistemas informáticos con funcionalidad DMA, representan líneas de señalización electrónica entre la CPU y el controlador DMA. Cada canal DMA tiene una línea de Solicitud y una de Confirmación. Un dispositivo que utiliza DMA debe estar configurado para utilizar ambas líneas del canal DMA asignado.
El bus mastering permitido por ISA de 16 bits. [5]
Asignaciones estándar de ISA DMA:
Una arquitectura PCI no tiene un controlador DMA central, a diferencia de ISA. En su lugar, un dispositivo PCI puede solicitar el control del bus ("convertirse en el maestro del bus ") y solicitar leer y escribir en la memoria del sistema. Más precisamente, un componente PCI solicita la propiedad del bus al controlador del bus PCI (normalmente el puente host PCI y el puente PCI a PCI [6] ), que arbitrará si varios dispositivos solicitan la propiedad del bus simultáneamente, ya que solo puede haber un maestro del bus a la vez. Cuando se le concede la propiedad al componente, emitirá comandos normales de lectura y escritura en el bus PCI, que serán reclamados por el controlador del bus PCI.
Por ejemplo, en una PC basada en Intel Core , el puente sur reenviará las transacciones al controlador de memoria (que está integrado en la matriz de la CPU) mediante DMI , que a su vez las convertirá en operaciones DDR y las enviará al bus de memoria. Como resultado, hay una gran cantidad de pasos involucrados en una transferencia PCI DMA; sin embargo, eso plantea un pequeño problema, ya que el dispositivo PCI o el bus PCI en sí son un orden de magnitud más lentos que el resto de los componentes (consulte la lista de anchos de banda del dispositivo ).
Una CPU x86 moderna puede utilizar más de 4 GB de memoria, ya sea utilizando el modo nativo de 64 bits de la CPU x86-64 , o la Extensión de Dirección Física (PAE), un modo de direccionamiento de 36 bits. En tal caso, un dispositivo que utilice DMA con un bus de direcciones de 32 bits no puede direccionar memoria por encima de la línea de 4 GB. El nuevo mecanismo de Ciclo de Dirección Doble (DAC), si se implementa tanto en el bus PCI como en el propio dispositivo, [7] permite el direccionamiento DMA de 64 bits. De lo contrario, el sistema operativo tendría que solucionar el problema utilizando costosos búferes dobles (nomenclatura DOS/Windows) también conocidos como búferes de rebote ( FreeBSD /Linux), o podría utilizar un IOMMU para proporcionar servicios de traducción de direcciones si hay uno presente.
Como ejemplo de un motor DMA incorporado en una CPU de propósito general, algunos chipsets Intel Xeon incluyen un motor DMA llamado Tecnología de Aceleración de E/S (I/OAT), que puede descargar la copia de memoria de la CPU principal, liberándola para hacer otro trabajo. [8] En 2006, el desarrollador del kernel Linux de Intel, Andrew Grover, realizó pruebas comparativas utilizando I/OAT para descargar copias de tráfico de red y no encontró más de un 10% de mejora en la utilización de la CPU con cargas de trabajo de recepción. [9]
Se han introducido mejoras orientadas al rendimiento en el mecanismo DMA en los procesadores Intel Xeon E5 con su función Data Direct I/O ( DDIO ), que permite que las "ventanas" DMA residan dentro de las cachés de la CPU en lugar de en la RAM del sistema. Como resultado, las cachés de la CPU se utilizan como la fuente y el destino principales para la E/S, lo que permite que los controladores de interfaz de red (NIC) realicen DMA directamente a la caché de último nivel (caché L3) de las CPU locales y eviten la costosa obtención de los datos de E/S de la RAM del sistema. Como resultado, DDIO reduce la latencia general del procesamiento de E/S, permite que el procesamiento de la E/S se realice completamente en la caché, evita que el ancho de banda/latencia de la RAM disponible se convierta en un cuello de botella del rendimiento y puede reducir el consumo de energía al permitir que la RAM permanezca más tiempo en estado de bajo consumo. [10] [11] [12] [13]
En los sistemas en un chip y los sistemas integrados , la infraestructura típica de bus del sistema es un bus en chip complejo, como el bus de alto rendimiento AMBA . AMBA define dos tipos de componentes AHB: maestro y esclavo. Una interfaz esclava es similar a la E/S programada a través de la cual el software (que se ejecuta en la CPU integrada, por ejemplo, ARM ) puede escribir/leer registros de E/S o (con menos frecuencia) bloques de memoria local dentro del dispositivo. El dispositivo puede usar una interfaz maestra para realizar transacciones DMA hacia/desde la memoria del sistema sin cargar demasiado la CPU.
Por lo tanto, los dispositivos de alto ancho de banda, como los controladores de red que necesitan transferir grandes cantidades de datos hacia o desde la memoria del sistema, tendrán dos adaptadores de interfaz para el AHB: una interfaz maestra y una esclava. Esto se debe a que los buses integrados en el chip, como el AHB, no admiten la conexión en tres estados del bus ni la alternancia de la dirección de ninguna línea en el bus. Al igual que PCI, no se requiere un controlador DMA central, ya que el DMA controla el bus, pero se requiere un árbitro en caso de que haya varios maestros presentes en el sistema.
Internamente, generalmente hay un motor DMA multicanal presente en el dispositivo para realizar múltiples operaciones de dispersión-reunión simultáneas según lo programado por el software.
Como ejemplo de uso de DMA en un sistema multiprocesador en chip , el procesador Cell de IBM/Sony/Toshiba incorpora un motor DMA para cada uno de sus 9 elementos de procesamiento, incluido un elemento de procesador de potencia (PPE) y ocho elementos de procesador sinérgico (SPEs). Dado que las instrucciones de carga/almacenamiento del SPE solo pueden leer/escribir su propia memoria local, un SPE depende completamente de los DMA para transferir datos hacia y desde la memoria principal y las memorias locales de otros SPE. Por lo tanto, el DMA actúa como un medio principal de transferencia de datos entre núcleos dentro de esta CPU (en contraste con las arquitecturas CMP coherentes con la caché, como la GPU de propósito general cancelada de Intel , Larrabee ).
El DMA en Cell es totalmente coherente con la memoria caché (nótese, sin embargo, que los almacenes locales de los SPE operados por el DMA no actúan como una memoria caché coherente globalmente en el sentido estándar ). Tanto en lectura ("get") como en escritura ("put"), un comando DMA puede transferir un área de bloque única de tamaño de hasta 16 KB, o una lista de 2 a 2048 de dichos bloques. El comando DMA se emite especificando un par de una dirección local y una dirección remota: por ejemplo, cuando un programa SPE emite un comando DMA put, especifica una dirección de su propia memoria local como origen y una dirección de memoria virtual (que apunta a la memoria principal o a la memoria local de otro SPE) como destino, junto con un tamaño de bloque. Según un experimento, un rendimiento máximo efectivo del DMA en Cell (3 GHz, bajo tráfico uniforme) alcanza los 200 GB por segundo. [14]
Los procesadores con memoria de borrador y DMA (como los procesadores de señales digitales y el procesador Cell ) pueden beneficiarse de la superposición de operaciones de memoria DMA mediante software con el procesamiento, mediante doble búfer o multibúfer. Por ejemplo, la memoria en chip se divide en dos búferes; el procesador puede estar operando con datos en uno, mientras que el motor DMA está cargando y almacenando datos en el otro. Esto permite que el sistema evite la latencia de la memoria y aproveche las transferencias en ráfagas , a expensas de necesitar un patrón de acceso a la memoria predecible . [ cita requerida ]