Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Tecnología del PC

[Home]  [Inicio]  [Índice]


2.3  Acceso directo a memoria

§1  Presentación

Puesto que la mayoría de datos que maneja el ordenador están antes o después en la memoria RAM, los intercambios entre esta y el resto de elementos son muy frecuentes.  En general este intercambio es conducido por el procesador, pero en determinados casos, la memoria pueda realizar intercambios directamente con los periféricos sin intervención del procesador.  Por ejemplo, el disco o una tarjeta de sonido, lo que conduce a un incremento del rendimiento del sistema.

§2  DMA

Ya desde su concepción inicial, los diseñadores del PC dispusieron una arquitectura que permitiese este tipo de intercambios.  El mecanismo utilizado se conoce como acceso directo a memoria DMA ("Direct Memory Access"), e igual que ocurre con las excepciones, el sistema DMA dispone de algunos elementos hardware auxiliares que lo convierten en un subsistema autónomo dentro del bus externo.  Estos elementos son:

  • Ciertas líneas dedicadas en el bus de control .
  • Un procesador específico, el DMAC ("DMA Controller"), que permite que puedan realizarse estos intercambios sin apenas intervención del procesador .
  • Pequeñas zonas auxiliares de memoria, conocidas como Registros de página .
§3  Líneas de control

El bus de control ( H2) tiene líneas específicas para este tipo de intercambios, de forma que el DMA es un subsistema autónomo dentro del mecanismo general de intercambio de datos y control del bus.  Son las siguientes:

  • Líneas DRQ1 a DRQ3 ("DMA request").  Utilizadas por los dispositivos que necesitan efectuar un acceso directo a memoria.
  • Líneas DACK1 a DACK3 ("DMA acknowledge").  Se utilizan para acusar recibo de la petición DRQ correspondiente.
  • AEN ("Access Enabled")  Cuando esta señal está alta, el controlador DMA tiene control sobre ciertas líneas del bus; precisamente las que gobiernan los intercambios con memoria y puertos (MEMR, MEMW, IOR, IOW, Etc).
  • MEMR ("Memory Read")  Cuando se activa, esta señal indica a la memoria conectada al bus que escriba los datos en el bus de datos.
  • MEMW ("Memory Write") Cuando se activa, indica a la memoria que almacene los datos situados en el bus de datos.
  • Conexiones del controlador DMA con las patillas 30 y 31 de la UCP ( 3.2.1)
§4  Controlador DMA

El mecanismo de acceso directo a memoria está controlado por un chip específico, el DMAC ("DMA Controller"), que permite realizar estos intercambios sin apenas intervención del procesador.  En los XT estaba integrado en un chip 8237A que proporcionaba 4 canales de 8 bits (puede mover solo 1 Byte cada vez); sus direcciones de puerto son 000-00Fh.  Posteriormente en los AT se instalaron dos de estos integrados y las correspondientes líneas auxiliares en el bus de control.

En contra de lo que podría parecer, el resultado no fue disponer de 8 canales, porque el segundo controlador se colgó en "Cascada" de la línea 4 del primero (más adelante se explica este concepto ).  Los canales del segundo DMAC está asignado a las direcciones 0C0-0DFh y son de 16 bits.   Pueden mover 2 Bytes (de posiciones contiguas) cada vez.

Cada canal tiene asignada una prioridad para el caso de recibirse simultáneamente varias peticiones (los números más bajos tienen prioridad más alta).  Pueden ser utilizados por cualquier dispositivo que los necesite (suponiendo naturalmente que esté diseñado para soportar este modo de operación).   Cada sistema los asigna de forma arbitraria, pero hay algunos cuya asignación es estándar.

Canal Uso
0 En los primitivos PCs estaba dedicado al refresco de memoria.  En los sistemas actuales está libre.
1 Libre:  Generalmente a dispositivos SDLC [3] (codificadores de audio)
2 Controlador de disquete
3 Controlador puerto de impresora ECP  [2]
4 Libre en los XT. Ocupado en los AT (segundo controlador DMAC)
5 Libre (AT)
6 Libre (AT)
7 Libre (AT)

Nota:  El Sistema Windows 98 incluye el programa MSINFO32.EXE con el que se pueden comprobar muchas características del sistema, incluyendo la asignación de canales DMA.  Los usuario de Linux pueden utilizar el comando dmesg | grep -i dma para obtener una relación de los dispositivos del sistema que, en principio, están habilitados para utilizar este tipo de transferencias.  Generalmente la relación contiene como mínimo los dos canales IDE (ide0 e ide1) y la unidad de disco (hda).

§5  Funcionamiento

El mecanismo de acceso directo a memoria DMA es bastante complejo en sus detalles, y por supuesto, el movimiento de grandes volúmenes de datos entre memoria y un dispositivo requiere cierta intervención del procesador.  El movimiento se hace a ráfagas, y cada transferencia se inicia con una interrupción que obliga al procesador a suspender su tarea para permitir un nuevo intercambio.  A continuación intentaremos mostrar una visión general del proceso.

Empezaremos señalando que el DMA permite mover datos entre un puerto y memoria, o entre memoria y un puerto, pero no entre dos puertos o entre dos posiciones de memoria [4].  Como veremos a continuación, cada transferencia DMA requiere cierta preparación previa;  conocer el volumen de datos a transferir (la más simple es de 1 byte) y la dirección de inicio del bufer de memoria involucrado (del que se leerán los datos o donde se escribirán).  Para esto dispone de dos registros para cada línea; el contador y el registro de direcciones.  Según se refieran a operaciones de lectura (memoria dispositivo) o escritura (dispositivo memoria) reciben distintos nombres porque su significado difiere:

  • Escritura:  Dirección de inicio  ("Write starting address").  Contador  ("Write starting word count")
  • Lectura:  Dirección actual de lectura ("Read current address").  Contador  ("Read remaining word count")

Después de cada transferencia (de 1 byte) el registro de direcciones del DMAC es incrementado en una unidad, y el contador es disminuido en una unidad.  Cuando este último llega a cero, la transferencia ha concluido, el DMAC pone en nivel alto la línea T/C ("Terminal Count") en el bus de control ( 2) y procede a enviar al procesador la señal EOP ("End of Process").  A partir de este momento el controlador no puede realizar otra transferencia hasta que sea programado de nuevo por la UCP.  Aunque existen varios canales, el sistema de prioridades garantiza que solo uno de ellos puede estar en funcionamiento cada vez, de forma que sus funcionamientos no pueden solaparse, y la señal EOP se refiere forzosamente al canal activo en ese momento.

El sistema DMA tiene distintas formas de operación , pero en el caso más simple, el proceso es como sigue:  cuando un dispositivo, que tiene asignado el canal x DMA, solicita una transferencia, activa la línea DRQx, avisando así al controlador DMAC de la petición.

Al recibir la señal, el controlador DMAC comprueba que dicha línea está programada y activada, y que no existe ninguna petición en otra línea DRQ de prioridad más alta.  A continuación solicita a la UCP que le ceda el control del bus enviándole una señal HRQ (Hold Request).

Cuando el procesador recibe la petición HRQ, termina la instrucción en curso, y una vez que está en condiciones de ceder el control del bus, deja "flotar" las señales relacionadas con su gobierno (MEMR, MEMW, IOR, IOW, Etc).  Es un estado denominado tri-state, en el que el procesador no coloca la patillas correspondientes en positivo ni en negativo.  A continuación envía una señal HLDA (Hold Acknowledge) al MDAC por la patilla correspondiente ( 3.2.1), indicándole que debe tomar el control.

Nota:  Después de ceder el control del bus, la UCP puede seguir su proceso, pero en cuanto llega a una instrucción que necesita un dato de memoria que no esté previamente en su cache (si es un procesador moderno), debe detenerse y permanecer a la espera de ganar el control de nuevo.  Esta circunstancia es totalmente transparente para el Sistema Operativo (y desde luego para las aplicaciones que corren sobre él).  El único síntoma sería el tiempo inusitadamente largo que tarda el procesador en ejecutar la próxima instrucción.

A partir de este momento, el MDAC toma control del bus y monitoriza las señales que dejó flotar la UCP; activa las líneas MEMR, MEMW, IOR e IOW.  Si suponemos que la transferencia DMA programada consiste en transferir 1 byte a la dirección xxxxh (de memoria), el DMAC coloca la dirección en el bus de direcciones y envía una señal al dispositivo que solicitó la transferencia activando la línea DACKx correspondiente, lo que indica al dispositivo que debe depositar el dato en el bus de datos.  A continuación de la señal DACKx el controlador DMA espera un ciclo y, suponiendo que el dispositivo no haya solicitado tiempo adicional mediante la señal CHRDY del bus ( 2), desactiva las líneas MEMW e IOR, lo que permite que se complete la operación ("Latch").  Los datos del bus de datos son escritos en la dirección contenida en el bus de direcciones.

Suponemos que se trata de un dispositivo lento, por lo que desactiva la señal DRQx anunciando al DMAC que no lo necesita por el momento.  El DMAC responde desactivando la señal DACKx que recuerda al dispositivo que no puede transmitir más, y comprueba si existen otras peticiones que atender.  A continuación coloca en tri-state las señales del bus y envía al procesador la señal EOP.  El procesador contesta desactivando a su vez la señal HLDA; deja de flotar las líneas de bus y continua con el proceso que venía ejecutando.

§6  Modos de operación

Aunque el mecanismo de transferencia se ajusta en lo sustancial al proceso anteriormente descrito, en realidad el controlador MDAC permite varios modos de operación:

§6.1  Sencillo ("Single")

Este modo transfiere solo un byte cada vez.  Después de cada transferencia el sistema cede el control del bus y debe adquirirlo de nuevo para transmitir el siguiente.  Es utilizada por dispositivos que solo pueden transmitir 1 byte cada vez a intervalos comparativamente muy largos (periféricos lentos).  Por ejemplo, el primitivo controlador de disquete del PC utilizaba este modo porque su bufer era de un byte.  El ciclo solicitud adquisición del bus transferencia cesión del bus, se repite cuantas veces que sean necesarias.

§6.2  Bloque ("Block")

Las transferencias se realizan en bloques (un máximo de 64 KB).  Se supone que el periférico es capaz de escribir/leer los datos a velocidad sostenida, porque una vez iniciada la transferencia, continúa hasta que se completa.  En caso necesario el periférico puede solicitar una pausa momentánea mediante la línea CHRDY del bus ( 2), pero en general los dispositivos lentos utilizan el modo anterior.

§6.3  Demanda ("Demand")

Como en el caso anterior, la transferencia se realiza en bloques, pero solo tiene lugar mientras el dispositivo mantiene activada la línea de "Petición" correspondiente (DRQ).  En cuanto la desactiva, el DMAC cesa la transferencia y devuelve el control del bus al procesador.  Si el dispositivo necesita transferir más datos debe solicitar otra transferencia.

§6.4  Cascada ("Cascade")

El procedimiento de transferencia descrito anteriormente, corresponde al primitivo sistema DMA ISA.  Es conocido como DMA de tercer elemento ("Third party"), en relación a que en el proceso intervienen tres miembros:  El dispositivo que envía los datos, el que los recibe y el controlador DMAC que sería el tercero (observe que en realidad, los datos NO pasan por él).  Este enfoque pronto se mostró insuficiente para controlar los intercambios con dispositivos de alta velocidad, de forma que se arbitraron nuevas soluciones.  El bus mastering o DMA de primer elemento ("First party"), llamado así en relación a que es el dispositivo que realiza el intercambio de datos (con la memoria) el que toma directamente el control del bus en lugar de hacerlo el controlador DMAC.  En consecuencia, debe controlar las señales necesarias del bus (MEMR, MEMW, IOR, IOW, Etc).

Este procedimiento permite encadenar entre sí varios dispositivos DMA, y fue precisamente esta capacidad, la utilizada en el diseño del AT para añadir el segundo controlador.  DMAC#2 se colocó en cascada con la línea 4 del DMAC#1.  Cuando el DAMC#1 recibe una petición por el canal 4, cede el control del bus al dispositivo peticionario, el DMAC#2.

§6.5  Autoinicialización ("Autoinicialize")

En esta forma las transferencias se realizan al modo Sencillo o Demanda, pero cuando la UCP vuelve a tomar el control y el dispositivo está listo para enviar o recibir nuevos datos, no es necesario reprogramar la siguiente transferencia.  Si se estaban transfiriendo datos desde el dispositivo a un bufer de memoria, la UCP puede seguir añadiendo datos al bufer a continuación de los últimos transmitidos.  Si era una transferencia de de datos desde un bufer hacia el dispositivo, la UCP puede seguir leyendo datos desde la última posición de leída y escribiéndolos en el dispositivo.

Esta técnica se utiliza con dispositivos que tienen bufers pequeños. Por ejemplo, dispositivos de audio.  Supone cierta sobrecarga para la UCP, pero es la única forma de eliminar el retardo existente entre el momento en que termina una transferencia y se reprograma la siguiente.

§7  Registros de página

Los chips 8237A y 8259A, elegidos por los diseñadores de IBM para los controladores DMAC y PIC del PC, en realidad habían sido diseñados para el 8085, un procesador de registros de 8 bits y bus de direcciones de 16 bits [1] que le proporcionaban un espacio de direccionamiento de 64 KB.  (216 = 65.536); muy por debajo de las 1.048.576 (220) posiciones que podía direccionar el PC ( 2).

Para que el DMAC pudiera seleccionar direcciones por encima del límite de 64 KB impuesto por su propio diseño, agregaron una pequeña memoria que pudiera contener la parte alta de las direcciones a manejar (desde las que leer, o en las que escribir, durante las operaciones DMA).  IBM las denominó registros de página y eran accesibles en e puerto 081-08Fh según el mapa adjunto (todas las direcciones son de lectura/escritura).

Puerto 0080-008Fh - Registros de página DMA

0081 DMA channel 2 address byte 2

0082 DMA channel 3 address byte 2

0083 DMA channel 1 address byte 2

0084 extra page register

0085 extra page register

0086 extra page register

0087 DMA channel 0 address byte 2

0088 extra page register

0089 DMA channel 6 address byte 2

008A DMA channel 7 address byte 2

008B DMA channel 5 address byte 2

008C extra page register

008D extra page register

008E extra page register

008F DMA refresh page register

La idea era componer la dirección (Dt) de la operación DMA, yuxtaponiendo dos direcciones (una especie de direccionamiento segmentado H5.1, aunque no exactamente).  La parte alta (D2) se guardaría en el registro de página y la parte baja (D1) en el registro de direcciones del DMAC, de modo que Dt = D2 # D1. Por ejemplo, si la dirección de destino de la transferencia es 00123456h, el registro de direcciones contendrá 3456h, y el registro de página del canal correspondiente el valor 0012h.   Como puede verse, la forma de componer la dirección resultante Dt a partir de la información de cada segmento (en hexadecimal) sería:  Dt = D1 + FFFF + D2.

Es fácil comprobar que el sistema presenta algunos inconvenientes.  El valor más alto posible para D1 es FFFFh, porque solo se dispone de 16 bits para su almacenamiento, y como puede verse en el mapa del puerto, el registro de página de cada canal es solo de 1 Byte, de forma que el valor más alto para D2 es FFh.  En conjunto solo se dispone de 8 + 16 = 24 bits para la dirección, y como resultado, el sistema DMA del PC estándar no puede direccionar memoria por encima de 16 MB (224) [5].

El diseño del sistema impone la limitación adicional de que el bloque máximo que puede manejarse en una sola transferencia es de 64 KB.  Está motivado porque el registro de página es totalmente independiente del DMAC y su funcionamiento no está sincronizado.  Cuando se inicia una operación, el valor D2 del registro de página permanece invariable, mientras que, como hemos visto, el valor D1 del registro de direcciones es incrementado con cada byte transferido.  Cualquiera que sea la dirección inicial XXh en D2, el rango de direcciones máximo que puede cubrirse corresponde al intervalo 0000-FFFFh en D1.  Después del último valor debería sumarse 1 a XXh y volver a comenzar por el valor D1 = 0000h, cosa que no está contemplada en el diseño.

§8  Evolución

Como todo lo relacionado con la arquitectura del ordenador, el sistema de acceso directo a memoria ha sufrido una considerable evolución desde sus inicios.  Además de las anteriores, han aparecido nuevas formas de funcionamiento, como el Ultra DMA o DMA-33.

En 1996 Intel introdujo el chip 82374 ESC (EISA System Component) que entre otras características incluye un superset de la funcionalidad del primitivo 8237A y que servía tanto para los buses EISA como para los (entonces emergentes) PCIs.  Respecto al mecanismo DMA tradicional, presenta la mejora de que permite acceso directo a un espacio de direcciones de 32 bits.

La introducción del "Bus mástering" permitió que determinados dispositivos controlaran la gestión del bus en sustitución del controlador DMA.  Esta es la forma de funcionamiento de los dispositivos rápidos en los buses PCI. 

  Inicio.


[1]  Este micro, lanzado por Intel en 1976, era en realidad una versión mejorada del 8080, que descendía a su vez del 8008...

[2]  ECP ("Enhanced Capabilities Port").  Este tipo de puerto paralelo bidireccional, desarrollado por HP y Microsoft, para conectar de forma económica periféricos de alta velocidad al PC (como impresoras de alto rendimiento y escáners), requiere acceso directo a memoria, algo que no era necesario en los puertos LPT normales SPP ("Standard Parallel Port") ni con los EPP ("Enhanced Parellel Port").  Actualmente la mayoría de PCs incluyen un chipset que puede manejar ambos tipos de puerto.  En estos casos, el programa de Setup de la BIOS permite seleccionar el puerto paralelo como ECP, EPP, o ECP+EPP.  En caso de utilizar ECP, la BIOS también puede permitir asignar el canal DMA correspondiente (generalmente el 3), aunque en los sistemas PnP es mejor confiar esta tarea a la propia BIOS.

[3]  Controlador síncrono serie de alta velocidad.  Generalmente utilizado en dispositivos de audio y comunicaciones.

[4]  Los movimientos de datos entre posiciones de memoria se realizan suficientemente bien mediante instrucciones de la UCP.

[5]  Esta cantidad de memoria RAM era inimaginable cuando se diseñó el PC, pero actualmente (2005) está dentro de lo posible.