Está en la página 1de 18

6.

Acceso Directo a Memoria (DMA)

Una de las tareas más comunes de una computadora es mover datos entre los puertos E/S y memoria o desde
un lugar en la memoria a otro. La CPU puede realizar esta tarea, pero los sistemas de computo modernos
proporcionan una pieza de hardware que puede mover datos independientemente de la CPU, liberándola para
que haga otras cosas. Este componente se llama controlador de acceso directo a memoria (DMA). En esencia
un DMA es un microcontrolador especializado optimizado para transferir bloques de datos de un lugar a otro.

Como un ejemplo de como trabaja el DMA en la PC, considere la transferencia de datos entre algún
dispositivo de entrada y memoria. Normalmente para introducir un dato, la CPU se detiene en un lazo de
programa checando un bit de estado para ver si un byte nuevo esta listo. Cuando el dispositivo de entrada
pone el bit de estado, la CPU sale del ciclo del lazo, lee el byte del puerto de entrada en el registro AL, y
finalmente lo escribe a alguna localidad de memoria. Una alternativa para hacer esto es usar el DMA. En este
caso, el DMA simplemente espera, sin hacer nada, hasta que una señal del dispositivo de entrada indica la
presencia de un nuevo dato apareciendo sobre su línea de petición de DMA (DREQ). Entonces pregunta a la
CPU si puede usar momentáneamente el bus, y envía una señal de selección de chip al dispositivo de entrada
vía la línea de reconocimiento de DMA (DACK), causando que el puerto de entrada coloque un byte sobre el
bus de datos. Simultáneamente suministra una dirección de memoria para leer el byte del puerto de entrada, el
cual es colocado en las líneas de datos. El proceso de DMA requiere sólo un ciclo de bus para transferir un
byte o palabra, comparado con dos ciclos de bus para una transferencia controlada por CPU (in al, dx y mov
mem, al) más el tiempo gastado en el ciclo de escrutinio.

6.1 Arquitectura del controlador de DMA

El controlador de DMA 8237A de Intel estuvo presente en la IBM PC original, y en la AT se uso un par de
controladores, en las tarjetas madre actuales se encuentra presente una circuitería que es funcionalmente
equivalente a un par de 8237A.

La figura 5.1 muestra un diagrama a bloques de un 8237A. El 8237A esta configurado para hacer
transferencias por DMA, teniendo la CPU que programar sus 16 registros internos a través de un conjunto de
16 puertos de E/S. La programación se hace a través de las líneas de control IOR', IOW' y CS' (chip select),
y las líneas de datos DB0 - DB7. Cuando realmente hace una transferencia por DMA, el 8237 toma las líneas
de control y dirección de la CPU, y genera estas señales el mismo. Esto es porque la línea CLOCK y
READY también como las líneas de control MEMR', MEMW', IOR' e IOW' y las líneas de dirección están
presentes. Aunque no esta indicado en la figura, las líneas de datos DB0- DB7 se convierten en las líneas de
dirección A8-A15 durante la transferencia por DMA.

El 8237 contiene tres bloques básicos de control lógico. El bloque de control y temporización (Timing and
Control) genera la temporización interna y señales de control externas para el 8237A. El bloque de control de
comando de programa (Command Control) decodifica los varios comandos dados al 8237A por el
microprocesador antes de servir una petición de DMA. También decodifica la palabra de Control de Modo
usada para seleccionar el tipo de DMA durante el servicio. El bloque Codificador de Prioridad (Priority

6- 96
Encoder) resuelve la contención de prioridad entre los canales de DMA que solicitan servicio
simultáneamente.

Figura 5.1 Diagrama a bloques del 8237A de Intel

Operación del DMA

El 8237A esta diseñado para trabajar en dos tipos de ciclos: los ciclos Ocioso (Idle) y Activo. Cada ciclo del
8237A puede asumir siete estados separados, cada uno compuesto de un periodo de reloj completo. El
Estado I (SI) es el estado inactivo. Se entra a él cuando el 8237A no tiene peticiones de DMA pendientes.
Mientras esta en el estado SI, el controlador de DMA esta inactivo pero puede estar en la Condición de
Programa, siendo programado por el procesador. El Estado S0, es el primer estado de un servicio de DMA.
El 8237A a solicitado un agarre (hold) pero el procesador aun no regresado un reconocimiento
(acknowledge). Un reconocimiento desde la CPU indicará que las transferencias pueden empezar. S1, S2, S3
y S4 son los estados de trabajo del servicio de DMA. Si se necesita más tiempo para completar la
transferencia, se pueden insertar estados de espera (SW) entre S2 o S3 y S4 usando la línea Ready en el
8237A.

Cuando el 8237A no tiene servicios de petición de canal, entra en el ciclo Ocioso y ejecuta estados SI. En
este ciclo el controlador de DMA muestrea las líneas DREQ cada ciclo de reloj para determinar si algún canal
esta solicitando un servicio de DMA. También muestrea CS’, observando si el microprocesador intenta
escribir o leer los registros internos del 8237A. Cuando CS’ y HLDA están en bajo, el 8237A entra a la
Condición de Programa y la CPU puede cambiar o inspeccionar la definición interna del DMA escribiendo o
leyendo los registros internos. Las líneas de dirección A0-A3 son entradas y seleccionan cuales registros serán
leídos o escritos. Las líneas IOR’ e IOW’ se usan para seleccionar y temporizar las lecturas o escrituras.
Debido al número y tamaño de los registros internos, un flip-flop interno se usa para generar un bit de
dirección adicional. Este bit se usa para determinar el byte superior o inferior de los registros Cuenta de
Palabra y Dirección de 16 bits. El flip-flop se reinicia por un “Master Clear” o Reinicio (Reset). Este flip-flop

6- 97
también se puede reiniciar por un comando de software.

Dentro de cada 8237 hay cuatro canales de DMA. Cada canal se puede programar independientemente para
realizar su propia transferencia por DMA, así un 8237 se comporta como cuatro controladores de DMA
coordinados de tal manera que en un tiempo dado sólo uno de ellos toma el control del bus.

Figura 5.2 Conexión en cascada de controladores de DMA

Dos 8237As se pueden conectar en cascada como se muestra en la figura 5.2, sin embargo, la conexión usa
las señales de un canal dando como resultado 7 canales de DMA. Esto fue hecho en la AT, el primer 8237
contiene los canales 0-3, mientras que el segundo contiene los canales 5-7. El canal 4 del segundo integrado
se usa para proporcionar la conexión en cascada entre los dos integrados. De los siete canales de DMA
disponibles, sólo uno tiene un uso predefinido, a saber el canal 2, el cual se usa para el controlador de disco
flexible. También debe notarse que la AT alambro los 8237As tal que los canales de DMA del primer
integrado solamente pueden hacer transferencia por DMA de 8 bits, mientras que los del segundo integrado
pueden hacer transferencia por DMA de 16 bits.

Para transferencias E/S a memoria, MEMW', IOR' y la línea DACK' conectada al dispositivo E/S todas ellas
se convierten en activas simultáneamente. Esto causa que los datos colocados en las líneas de datos por el
dispositivo de entrada sean transferidos directamente a memoria sin ir a través del controlador de DMA.
Similarmente para transferencias de memoria a E/S, MEMR', IOW', y la línea DACK apropiada se convierten
en activas simultáneamente, causando otra vez una transferencia directa de memoria al dispositivo E/S. Ya que
hay una dirección presente en el bus de direcciones durante la transferencia, algo se debe hacer para prevenir
que otros dispositivos E/S respondan. Para prevenir este error, el 8237 maneja una línea de habilitación de
dirección (AEN), la cual se pone en alto durante una transferencia DMA. Todos los decodificadores de
6- 98
dirección de puerto E/S deben examinar la línea AEN y prevenir que los dispositivos E/S se activen cuando
AEN es alto.

Las líneas DREQn (solicitud de DMA) son entradas que se deben alambrar a los dispositivos E/S que
necesitan servicio DMA. Las líneas de salida correspondientes DACKn (reconocimiento de canal de DMA)
se deben alambrar a aquellos dispositivos E/S que sirven como las selecciones de integrado del dispositivo
E/S. Cuando el 8237 recibe una petición de DMA desde una línea DREQn, pone HRQ (solicitud de
suspensión) en alto. Esta línea se conecta al HOLD de la CPU, causando que la CPU ponga en tercer estado
sus líneas de dirección, datos y control. La CPU le dice al 8237 que esto esta hecho subiendo la línea HLDA.
Cuando se ve que HLDA se va a alto, el 8237A empieza su transferencia DMA. La línea EOP' (fin de
proceso) del 8237 es bidireccional. Cuando se usa como salida, EOP' se va a bajo cuando se alcanza la
cuenta terminal, esto es, cuando el número programado de bytes ha sido transferido. Cuando se usa como
entrada, EOP' puede ser empujada a bajo por un dispositivo externo para terminar cualquier operación de
DMA en progreso.

Los canales de DMA están priorizados tal que si más de una señal DREQ vienen al mismo tiempo, solo un
canal DMA a la vez se puede convertir en activo. En la PC, los canales tienen una prioridad fija con el canal 0
teniendo la prioridad más alta y el canal 7 la más baja.

6.2 Registros del 8237A


A continuación se listan los nombres y tamaños de cada registro del (8237A):
Nombre Tamaño Número
Registros de Dirección Base 16 bits 4
Registros de Cuenta de Palabra Base 16 bits 4
Registros de Dirección Actual 16 bits 4
Registros de Cuenta de Palabra Actual 16 bits 4
Registro de Dirección Temporal 16 bits 1
Registro de Cuenta de Palabra Temporal 16 bits 1
Registro de Estado 8 bits 1
Registro de Comando 8 bits 1
Registro temporal 8 bits 1
Registros de Modo 6 bits 4
Registro de Máscara 4 bits 1
Registro de Petición 4 bits 1

Para entender como se transfieren realmente los datos, necesitamos entender los registros internos del 8237A
que se usan para almacenar direcciones de memoria, cuentas de bloque, modos, comandos y estados. Cada
canal de DMA tiene una palabra de modo de 6 bits y cuatro registros de 16 bits asociados con él, a saber
una cuenta y dirección actual, y una cuenta y dirección base. La dirección base (de inicio) y cuenta (número de
bytes a transferirse) se envían al DMA antes de que tome lugar una operación y automáticamente inicialice la
dirección actual y registros cuenta a los mismos valores. Después de que cada byte se transfiere, la dirección
actual se incrementa o decrementa (dependiendo de si el bit 5 de la palabra de modo del canal es 0 ó 1), y la
cuenta actual se decrementa. La transferencia continua hasta que la cuenta actual llega a cero (cuenta terminal),
6- 99
o hasta que la patita EOP' se maneja a bajo por algún dispositivo externo.

El controlador de DMA 8237-5 que se usa en la PC tiene cuatro canales DMA. Dos de los cuales se usan en
el diseño de la PC, el canal 0 se usa en la función de refresco de memoria dinámica de la unidad del sistema, y
el canal 2 se usa para transferir datos entre el controlador de disco flexible y memoria. Los canales 1, 2 y 3
están disponibles en el bus para uso de interfaces instaladas en las ranuras de tarjeta del bus. El BIOS de la
PC inicializa el DMA tal que el canal 0 tiene la más alta prioridad y el canal 3 tiene la más baja.

El 8237-5 tiene 16 direcciones de registro de puerto E/S de lectura/escritura que contienen tanto los datos de
inicialización como estado del dispositivo. La PC decodifica al 8237-5 tal que las direcciones de puerto
residen en el rango de 0000 a 000Fh. Las direcciones de puerto están divididas en dos grupos: las direcciones
0000 a 0007h son registros de lectura escritura que contienen las direcciones de memoria de inicio de DMA
para cada canal, dirección de memoria actual para el siguiente ciclo DMA en cada canal, y la cuenta byte
actual de cada canal. El segundo grupo de direcciones de puerto E/S, de 0008 a 000Fh, contiene los registros
de estado y control que define la operación de cada canal.

La siguiente tabla define la función de cada una de las direcciones en el rango de 0008 a 000Fh. Las funciones
son diferentes para lectura y escritura, así, típicamente no es posible leer los contenidos de registros sólo de
escritura.

Dirección Función de lectura Función de escritura


0008 Registro de estado Registro de comando
0009 No usado Registro de petición
000A No usado Registro bit de máscara individual
000B No usado Registro de modo
000C No usado Limpia byte apuntador de flip-flop
000D Registro temporal Borrador (clear) maestro
000E No usado Limpia registro máscara
000F No usado Escribe todos los bits de registro máscara

Registro de Comando

Este registro de 8 bits controla la operación del 8237A, lo programa el microprocesador en la Condición de
Programa y se limpia con un Reinicio o una instrucción de Master Clear. Este registro se carga escribiendo a la
dirección E/S 0008h. Las definiciones de los bits de este registro son las siguientes:

Bit Valores Función


0 0 = deshabilita Habilita o deshabilita la función de mover de memoria a memoria.
Cuando esta función se selecciona, los canales 0 y 1 se usan para
1 = habilita
apuntar a dos bloques de memoria diferente y se puede usar para

6- 100
transferir datos entre dos bloques. En la PC no se puede usar
porque el canal 0 esta dedicado al refresco de memoria.
1 0 = deshabilita contenedor dirección Valido solo cuando la función del bit 0 se selecciona. Deshabilita la
canal 0 función de incremento o decremento en el canal 0, permitiendo un
1 = habilita contenedor direcciónpatrón fijo para ser escrito en un bloque de memoria. No se usa en
la PC.
canal 0
X = si bit 0 = 0
2 0 = habilita controlador Habilita o deshabilita el controlador DMA
1 = deshabilita controlador
3 0 = tiempo normal Selecciona un ciclo de bus DMA especial comprimido. En este
modo sólo genera tres pulsos en el ciclo de bus DMA. No se debe
1 = tiempo comprimido
seleccionar este modo en la PC porque puede reducir el tiempo de
X = si bit 0 = 1 acceso a puerto E/S y memoria y causar una operación invalida.
4 0 = prioridad fija Selecciona un modo de prioridad rotada. En la PC no se debe
seleccionar porque el canal 0 de refresco de memoria siempre debe
1 = prioridad rotada
tener la prioridad más alta.
5 0 = escritura retrasada Selecciona el tiempo de la señal de escritura del ciclo del bus. La
PC selecciona un modo retrasado. Esto no se debe cambiar porque
1 = escritura extendida
los ciclos de memoria dinámica del sistema se disparan desde el
X = si bit 3 = 1 flanco de la señal de escritura, si viene retrasado en el ciclo DMA,
el dato pudiera no ser válido.
6 0 = DREQ sensa el activo alto Selecciona el nivel activo de las señales DREQ que llegan al
controlador. La PC selecciona nivel alto como activo.
1 = DREQ sensa el activo bajo
7 0 = DACK sensa el activo bajo Selecciona el nivel activo de las señales DACK enviadas por el
controlador. La PC selecciona nivel bajo.
1 = DACK sensa el activo bajo

El BIOS de la PC inicializa el registro comando con el valor 00h.

Registro de Petición

Cada canal de DMA tiene un bit de petición asociado con el en el Registro de Petición de 4 bits, estos bits
son no enmascarables y están sujetos a la prioridad del Codificador de Prioridad. Cada bit se pone o limpia
separadamente por control de programa, o se limpia con la generación de una cuenta terminal o una EOP’
externa. Este registro se puede cargar escribiendo a la dirección de puerto E/S 0009h. Este registro se puede
usar para generar una petición DMA por control de software, para hacer una petición por programa, el canal
debe estar en el Modo de Bloque. Ver figura 5.4 para la codificación de las direcciones de registro. Las
definiciones de bits del registro de escritura son las siguientes:

6- 101
Figura 5.3 Registro petición de escritura

Figura 5.4 Definición de los Códigos de Registro

Registro de Máscara

Cada canal tiene asociado un bit de máscara que puede ser puesto para deshabilitar las DREQ entrantes.
Cada bit de máscara se pone cuando su canal asociado produce un EOP’ si el canal no esta programado para
Autoinicializar. Cada bit del registro de Máscara también se puede poner o limpiar separadamente por
programa. El registro completo también se pone por un Reinicio. Esto deshabilita todas las peticiones de
DMA hasta que una instrucción de limpia Registro de Máscara les permite que ocurran. La instrucción para
poner o limpiar separadamente los bits de máscara es similar en forma a la usada con el registro de Petición.
Escribiendo a este registro en la dirección 000Ah, permite que los canales DMA individuales se enmascaren.
Si el bit de máscara está puesto, el canal está deshabilitado.

Figura 5.5 Registro bit de máscara individual

6- 102
Escribe todos los bits del Registro de Máscara

Este es un comando con el que todos los cuatro bits del Registro de Máscara se pueden escribir. Esto se hace
direccionando el puerto 000Fh. Se usa tanto para controlar individualmente y simultáneamente los bits del
registro de máscara del canal DMA. La definición de bits de este registro es la siguiente:

Bit Valor Función


0 0 Despeja bit de máscara de canal 0
1 Pone bit de máscara de canal 0
1 0 Despeja bit de máscara de canal 1
1 Pone bit de máscara de canal 1
2 0 Despeja bit de máscara de canal 2
1 Pone bit de máscara de canal 2
3 0 Despeja bit de máscara de canal 3
1 Pone bit de máscara de canal 3
456 X Condiciones sin importancia
7

Registro de modo

Cada canal tiene un Registro de Modo de 6 bits. Cuando el microprocesador escribe en el registro en la
Condición de programa, los bits 0 y 1 determinan cual registro de Modo de canal será escrito. Es un registro
sólo de escritura que define varios modos de operación para cada uno de los cuatro canales DMA. Los
registros base mantienen los valores iniciales de los registros actuales correspondientes para que cuando la
cuenta actual se decrementa a 0 los registros actuales se pueden recargar automáticamente si el bit 4 del
registro de modo del canal esta puesto a 1. Los bits 3 y 2 del registro de modo especifican transferencia de
lectura (10) o escritura (01), y los bits 7 y 6 especifican uno de cuatro posibles modos de transferencia:
demanda (00), individual (01), bloque (10) y cascada (11). Los bits 1 y 0 especifican el número de canal. Se
carga escribiendo a la dirección de puerto 000Bh. Las funciones para cada bit son:

Bit Valor Función


1,0 00 Selecciona canal 0
01 Selecciona canal 1
10 Selecciona canal 2
11 Selecciona canal 3
2,3 00 Verifica Transferencia
01 Transferencia de escritura

6- 103
10 Transferencia de lectura
11 Ilegal
XX Si bits 6 y 7 = 11
4 0 Deshabilita auto inicialización
1 Habilita auto inicialización
5 0 Selecciona incremento de dirección
1 Selecciona decremento de dirección
6,7 00 Selecciona modo de demanda
01 selecciona modo individual
10 Selecciona modo de bloque
11 Selecciona modo de cascada

Los bits 0 y 1 seleccionan el canal DMA al que se aplicará el comando de modo.

Los bits 2 y 3 definen los tres tipos diferentes de transferencias que se realizaran sobre el canal especificado.
Hay tres operaciones disponibles: 1) una operación de verificación que realiza un ciclo de bus sin una
operación de lectura o escritura. El 8237A opera como en las transferencias de lectura y escritura generando
direcciones, y respondiendo a EOP, etc. Sin embargo, las líneas de control de memoria y E/S permanecen
inactivas, 2) una operación de escritura que toma datos desde una interfase o adaptador y los escribe en
memoria activando MEMW’ e IOR’, y 3) una operación de lectura que toma datos de memoria y los escribe
a la interfase o adaptador activando MEMR’ e IOW’.

El bit 4 habilita o deshabilita un modo de auto inicialización en un canal especifico. Con este modo se
reinicializa el registro de dirección actual y registro de cuenta actual del canal DMA con los valores en el
registro de dirección base y el registro cuenta. Esto pasa cuando el registro cuenta actual alcanza el cero y la
señal de cuenta terminal se usa desde el controlador. Esta función permite al controlador ser automáticamente
configurado para aceptar más de una petición DMA después que una función DMA anterior se ha
completado.

El bit 5 selecciona la función de incremento o decremento en el registro de dirección DMA actual.

Los bits 6 y 7 seleccionan el tipos de operaciones DMA permitidas en el canal seleccionado. Los cuatro
modos básicos de operación son:

• En modo de transferencia individual, el dispositivo se programa para hacer una sola transferencia. La
cuenta de palabras será decrementada y la dirección decrementada o incrementada después de cada
transferencia. La señal DRQ debe ser subida por cada byte transferido. Si la DRQ se mantiene activa, el
controlador permite un ciclo de bus 8088 después de cada ciclo DMA, así se asegura que el procesador
nunca esta bloqueado completamente desde el bus debido a una petición DMA colgada.

6- 104
• En modo de transferencia de bloque, sólo una señal DRQ inicia la transferencia de un bloque completo de
datos. La transferencia de bloque se detiene cuando se alcanza la cuenta terminal. El 8088 se bloquea
desde el bus durante la transferencia de bloque. Este modo no se debe seleccionar en la PC porque
pudiera bloquear los ciclos DMA que se requieren para refrescar la memoria y la transferencia de datos a
disco flexible, causando así una condición de desbordamiento.

• En modo de transferencia por demanda, los datos se transfieren mientras que la cuenta terminal no se ha
alcanzado o se encuentra un EOP’ externo, o hasta que se inactive la señal DRQ. Este modo se puede usar
si la señal DRQ se deja caer después de cada ciclo DMA, de otro modo, los mismos problemas que en el
modo de transferencia de bloque se presentan.

• Modo de Cascada. Este modo se usa para poner en cascada más de un 8237A. Las señales HRQ y
HLDA de los 8237A adicionales se conectan a las señales DREQ y DACK de un canal del 8237A inicial.
En el modo de cascada, la PC programa todos los canales DMA para operación en modo de transferencia
de byte individual.

El BIOS de la PC inicializa los canales 1 y 3 (los dos canales no usados por la PC) con los valores 41h y 43h
respectivamente.

Registro de estado

El registro de estado se puede leer por la CPU para determinar cuales canales tienen peticiones DMA
pendientes y cuales canales han alcanzado su cuenta terminal. El estado del controlador se puede obtener
leyendo la dirección de puerto 0008h. Este registro de estado contiene bits que indican si un canal ha
alcanzado su cuenta terminal completando la transferencia DMA. Los bits 3-0 se ponen cada vez que se
alcanza una cuenta terminal o se aplica un EOP’ externo. También contiene bits que indican si un canal tiene
una petición DMA pendiente, los bits 7-4 se ponen en cualquier momento que su canal correspondiente esta
solicitando servicio. La definición de los bits de este registro es la siguiente:

Bit Valor Función


0 1= Canal 0 alcanzó cuenta terminal
1 1= Canal 1 alcanzó cuenta terminal
2 1= Canal 2 alcanzó cuenta terminal
3 1= Canal 3 alcanzó cuenta terminal
4 1= Petición canal 0
5 1= Petición canal 1
6 1= Petición canal 2
7 1= Petición canal 3

Registro temporal

6- 105
Este registro se usa para mantener datos durante una transferencia de memoria a memoria. Después de
finalizada una operación de transferencia de memoria a memoria, el valor del último byte transferido se puede
obtener leyendo el registro temporal en la dirección de puerto E/S 000Dh. Este registro no se usa en la PC.

Registros de cuenta y dirección

Como ya se menciono, cada canal de DMA tiene cuatro canales de 16 bits que se usan para apuntar a la
localidad de memoria para la transferencia, mantener una cuenta de longitud de transferencia, y terminar la
transferencia. La dirección de inicio de una operación DMA se carga en el registro de dirección base, el
registro de dirección actual contiene la dirección a usarse en el siguiente ciclo DMA. Cuando un datos se
escribe a la dirección base para un canal específico, el registro de dirección actual se carga automáticamente
con el mismo valor. Hay un par de registros de dirección base y actual para cada uno de los cuatro canales
DMA.

El número de bytes a ser transferidos, antes de que se termine la operación o se reinicialice por la función de
auto inicialización, se controla por los contenidos de los registros cuenta base y cuenta palabra actual. Cada
uno de estos registros es de 16 bits, y existe un par para cada uno de los canales DMA. El registro base se
carga con el número de bytes que serán transferidos. El registro cuenta palabra actual contiene el valor de la
cuenta que falta para ser transferida antes de que la operación se termine o reinicialice. La carga del registro
base automáticamente carga el mismo valor en el registro cuenta actual.

Comandos de Programa

Son comandos que se pueden ejecutar en la Condición de Programa. No dependen de algún patrón de bits
específico. Los tres comandos de programa son:

1.- Flip-flop apuntador a byte despejado (clear)

Ningún dato esta asociado con la operación de escritura a la dirección de puerto E/S llamada flip-flop
apuntador a byte despejado. Una escritura a la dirección de puerto 000Ch despeja un flip-flop interno que se
usa para apuntar al byte alto o bajo de valores de 16 bits, los cuales se cargan y leen de las direcciones de
puerto 0000 a 0007h. Cuando el flip-flop se despeja, la siguiente operación de lectura o escritura en la
dirección de puerto carga o lee los bits de orden bajo del valor de 16 bits. La operación de lectura o escritura
cambia el valor (toggles) del flip-flop tal que la siguiente operación de lectura o escritura apunta a los 8 bits de
orden alto del valor de 16 bits. Esta técnica conserva el registro decodificado en el controlador. Esta función
se usa para leer y escribir los contenidos del registro de dirección actual para cada canal, el registro de
dirección base de cada canal, el registro de cuenta actual para cada canal, y el registro de cuenta base para
cada canal. Cada uno de estos registros es de 16 bits pero tienen solamente una dirección de puerto de 8 bits.

2.- Despejado maestro (Master Clear)

Cuando se escribe a la dirección de puerto E/S 000Dh, llamada despejado maestro, realiza una función de
despejado en el controlador, tiene el mismo efecto que el Reinicio por hardware. Los registros de Comando,
Estado, Petición, Temporal, y Flip-flop Primero/Ultimo Interno se limpian y el Registro de Máscara se pone.

6- 106
El 8237A entrará en ciclo Ocioso. El controlador requiere inicialización después de que se envía un despejado
maestro. Ningún dato se asocia con este comando.

3.- Despeja registro de máscara

El despejado de registro de máscara esta en la dirección de puerto E/S 000Eh. La escritura a este puerto
reinicia todos los bits del registro de máscara de canal DMA, habilitando así los cuatro canales.

Los códigos de los comandos de programa se muestran en la siguiente tabla:

Todos los registros del controlador de DMA se leen y escriben usando los puertos en el rango de 0000 a
0007h y la función de flip-flop apuntador a byte descrita previamente. A continuación se describe la dirección
de puerto para los registros de cuenta y dirección del 8237, y se aprovecha para hacerlo a manera de resumen
de todos los puertos de los dos controladores DMA presentes en la PC. El esclavo maneja peticiones DMA
de 8 bits a través de los canales 0-3. el maestro maneja peticiones DMA de 16 bits a través de los canales 4-
7.

Puerto Puerto Lectura Escritura


Esclavo Maestro
Canales 0-3 Canales 4-7
0x000 0x0C0 Dirección canal 0 Dirección canal 0
0x001 0x0C2 Cuenta canal 0 Cuenta canal 0
0x002 0x0C4 Dirección canal 1 Dirección canal 1
0x003 0x0C6 Cuenta canal 1 Cuenta canal 1
0x004 0x0C8 Dirección canal 2 Dirección canal 2
0x005 0x0CA Cuenta canal 2 Cuenta canal 2
0x006 0x0CC Dirección canal 3 Dirección canal 3

6- 107
0x007 0x0CE Cuenta canal 3 Cuenta canal 3
0x008 0x0D0 Estado Comando
0x009 0x0D2 Petición
0x00A 0x0D4 Máscara de canal
0x00B 0x0D6 Modo
0x00C 0x0D8 Despeja flip-flop apuntador a byte
0x00D 0x0DA Despejado maestro
0x00E 0x0DC Despeja registro de máscara
0x00F 0x0DE Escribe todos los bits registro de máscara

Registros página DMA

El controlador DMA 8237A soporta sólo 16 bits de direccionamiento y sólo transfiere longitudes de 65,536
bytes. El tamaño de página es de 64 K para el primer 8237A, pero es de 128 K para el segundo porque sólo
transfiere palabras y por consiguiente maneja las líneas A0-A16. Para permitir al DMA trabajar en cualquier
memoria, se necesita alguna circuitería adicional para crear más bits de dirección. En la AT se hace agregando
una fila de registros de 8x8 74LS612. Cada registro de 8 bits en la fila de registros almacena los bits de
dirección de orden alto para uno de los siete canales DMA. Los registros en el 74LS612 se llaman registros
de página DMA. Una fila de registros es como un conjunto de seguros (latches), excepto que están presentes
dos conjuntos independientes de líneas de habilitación y dirección (una para lectura y otra para escritura) tal
que las operaciones de lectura y escritura se pueden realizar simultáneamente.

Los bits de dirección de orden alto adicionales del registro de pagina manejan las líneas A16-A23 (o A17-
A23 para los canales DMA 5-7). Desafortunadamente, esto sólo permite direccionar memoria en los
primeros 16 MB de la CPU. Cuando la PC AT se diseño, esto fue suficiente porque el 80286 sólo podía
direccionar 16 MB. Una manera de resolver el problema es escribir programas que usen doble buffer. La
transferencia DMA se hace desde el dispositivo E/S hacia un buffer localizado en los primeros 16 MB de
memoria, y después la CPU hace una transferencia de bloque de memoria a memoria para mover los datos a
su destino final. El problema con esto es que se reduce el rendimiento del DMA. Una solución de rendimiento
mayor es colocar un controlador DMA más capaz en la tarjeta misma, y simplemente no usar el controlador
DMA de la tarjeta madre. Esto se hace comúnmente, y permite velocidades de transferencia muy altas. El
controlador DMA de la tarjeta madre pudiera ser mejorado, pero entonces la PC no sería estándar y deberán
escribirse muchos programas para tomar ventaja de sus capacidades. Las direcciones de los registros de
página DMA son las siguientes:

Canal DMA Puerto


0 0x087
1 0x083
2 0x081

6- 108
3 0x082
4 0x08F
5 0x08B
6 0x089
7 0x08A

Cada ciclo DMA dura 5 pulsos de reloj, pero en el diseño de la PC, se inserta un pulso extra como estado de
espera para asegurar el tiempo de acceso de memoria y puertos E/S. En la PC original cada transferencia por
DMA dura 6 pulsos, el total del ciclo es de 1.26 microsegs. El diseño de la PC también requiere que el
controlador de DMA corra en modo de transferencia de byte individual. Esto significa que un ciclo 8088 debe
estar entre cada ciclo DMA. Debido a que el ciclo del 8088 dura cuatro ciclos, ó 840 nanosegundos, este
tiempo se suma al de DMA, así el tiempo mínimo entre ciclos DMA es 2.1 microsegundos, dando a la PC
original una taza de transferencia máxima por DMA de 476 K/s.

6.3 Programando el DMA

Para usar DMA para operaciones E/S, el puerto E/S usado debe tener la circuitería apropiada para activar y
responder al canal de DMA deseado. Específicamente, el puerto debe ser capaz de activar la línea de
petición DMA para el canal n de DMA (DREQn) y responder a la línea de reconocimiento DMA para el
canal n (DACKn). Cuando el puerto esta listo para recibir o enviar nuevos datos, asevera DACKn. Cuando el
controlador de DMA ve que DREQn se va a alto y esta listo para aceptar (enviar) los nuevos datos, responde
aseverando la línea DACKn y la línea IOR' (IOW'). El puerto debe entonces poner (leer) los nuevos datos
sobre las líneas de datos. Note que esto es bastante diferente de la manera usual en que trabaja un puerto E/S.
Normalmente, un puerto sólo se activa cuando la línea IOR' (IOW') esta aseverada y la dirección del puerto
esta presente en las líneas de dirección tal que el decodificador de dirección pueda generar una señal de
selección de integrado (chip).

Para entender con más detalle exactamente como se hacen las operaciones de DMA, veamos el ejemplo
específico de leer un bloque de datos en memoria desde un puerto de entrada usando el modo de
transferencia individual del controlador de DMA. La secuencia de eventos es como sigue:

1. Primero se programa el controlador de DMA cargando sus registros internos con la siguiente información:

a) El modo DMA (transferencia individual por petición, transferencia de bloque, etc.) para el canal n
se escribe dentro del registro de modo (en el puerto dmabase+0Bh). El valor de la dirección base
del puerto E/S del controlador DMA es dmabase = 0 para el primer 8237A (canales 0 - 3) y
dmabase = 0C0h para el segundo 8237A.

b) El primer/último flip flop se limpia escribiendo cualquier valor al puerto dmabase + 0Ch. Esto
inicializa el DMA tal que los valores de la dirección base de 16 bits y de cuenta de 16 bits se le
puedan enviar usando dos operaciones de salida de byte consecutivas.

6- 109
c) El registro de dirección base en la dirección de puerto dmabase + 2*n (por ejemplo, puerto 4 para
canal 2) se carga haciendo dos operaciones de salida consecutivas que envían el byte más bajo y
después el más alto de una dirección base de 16 bits al registro. Esta operación también carga el
registro de dirección actual con el mismo valor.

d) El registro cuenta palabra base en la dirección de puerto dmabase + 2*n+1 (por ejemplo, puerto 5
para canal 2 de DMA) se carga haciendo dos operaciones de salida consecutivas que envían el
byte más bajo y después el más alto de una cuenta de palabras de 16 bits al registro. Estas
operaciones también cargan el registro cuenta palabra actual con el mismo valor.

e) El DMA solo saca direcciones de 16 bits. Los bits de orden alto de la dirección debe ser puesto en
un registro de página DMA cuya dirección base es dmapage = 80h.

f) El bit de máscara para el canal n de DMA se limpia cargando el número de canal en el registro de
máscara (puerto dmabase + 0Ah).

Ejemplo de código para hacer las operaciones a) hasta f):


mov al, 46h ;establece transferencia de un solo byte canal 2
out dmabase+11, al ;Saca byte de modo
out dmabase+12, al ;reinicia primero/último flip-flop
mov al, bl ;saca offset de dirección dentro
out dmabase+4, al ;de página DMA actual
mov al, bh
out dmabase+4, al
mov al, 00 ;saca cuenta = 512
out dmabase+5, al
mov al, 02
out dmabase+5, al
mov al, DMA_PAGE ;almacena # pág. DMA de 64K en registro de pág.
out dmapage+1, al ;de canal 2
out dmabase+10, al ;desenmascara canal 2

El modo y números de canal dados aquí son aquellos usados por el controlador de disco flexible cuando lee o
escribe sectores del disco.

2. Después que el DMA se programa, sólo espera hasta que la línea DREQn se asevera por el puerto E/S.
Alternativamente, la CPU puede empezar una transferencia DMA fijando un bit en el registro de petición
de canal del controlador.

3. Cuando DREQn se asevera, el DMA asevera la línea HOLD de la CPU (siempre que el bit de mascara de
canal haya sido limpiado). Cuando esta línea va a alto, la CPU termina su ciclo de bus actual (esto es,
termina la operación de memoria o puerto E/S o escritura actualmente en progreso), renunciando al control
del bus poniendo en tercer estado sus líneas de dirección, datos y control, y asevera la línea de
reconocimiento de agarre (HLDA) en el DMA. La CPU no toma de regreso el control del bus para
empezar cualquier ciclo nuevo del bus hasta que el controlador de DMA manda HOLD de regreso a bajo
otra vez.

4. Tan pronto como el DMA recibe la señal HLDA, empieza una transferencia DMA aseverando DACKn e
6- 110
IOR'. Al mismo tiempo, también asevera MEMW' y coloca la dirección en su registro de dirección actual
sobre las líneas de dirección. Note que tanto IOR' y MEMW' son activas al mismo tiempo, lo cual es ilegal
durante ciclos de bus normal de CPU. Para prevenir que algún puerto E/S responda a la presencia de la
dirección e IOR' en el bus. El DMA también pone la línea AEN en alto. Todos los puerto E/S deben ser
alambrados tal que no respondan al ver su dirección de puerto e IOR' en el bus si AEN es alto.

5. Cuando el puerto E/S ve que IOR' y DACKn son aseveradas, coloca sus datos en las líneas de datos, y
por lo tanto MEMW' es también activa, la localidad de memoria especificada por las líneas de dirección
hace que los datos inmediatamente se escriban en ella. La transferencia total sucede en un solo ciclo de
bus.

6. Después de terminar la transferencia, el DMA automáticamente incrementa el registro de dirección actual


(o lo decrementa, dependiendo del bit 5 en el registro de modo) y también decrementa el registro cuenta
palabra actual. Si el valor en el registro cuenta palabra actual no es cero, el controlador se regresa a
esperar la siguiente señal DREQn.

7. Si el registro cuenta palabra actual es cero después de ser decrementado, y el bit de autoinicializo en el
registro de modo no esta puesto, el DMA pone el bit de máscara para el canal DMA asociado (y asevera
la señal de salida fin de proceso, EOP'). No es posible ninguna transferencia DMA adicional hasta que el
DMA se reprograma para limpiar el bit de máscara y reinicializar los registros de dirección y cuenta
palabra.

8. Si el bit de autoinicializo esta puesto cuando el registro cuenta palabra actual se decrementa a cero, el
DMA automáticamente recarga los registros dirección actual y cuenta palabra actual desde los registros de
dirección base y cuenta palabra base, y el bit del registro de máscara permanece limpio, permitiendo que
continúen operaciones DMA adicionales.

Como segundo ejemplo de DMA, se ilustra el uso de DMA para control experimental de un programa que se
usa para sacar una forma de onda de voltaje arbitraria desde un DAC (conversión analógica digital) de 12
bits. Suponemos que la línea DACK3 esta conectada a la línea de selección de integrado del DAC (tal que el
canal 3 del DMA sacara datos al DAC), y que una señal de reloj esta conectada a DREQ3 (tal que un nuevo
byte de datos se solicita desde el controlador DMA en cada tictac del reloj). Una tabla de valores de 16 bits
que define la forma de onda se almacena en un área de buffer llamada wave. El siguiente programa configura el
canal 3 de DMA para sacar los contenidos de wave, la cual se asume para estar en la misma página de
memoria de 64K:

dmabase equ 0 ;puerto DMA origen en la IBM PC


dmapage equ 80h ;registro página DMA
dwavcnt equ 2000h ;cuenta byte de la forma de onda por omisión (4096
palabras)

dmawav: mov al, 05Bh ;pone canal 3 DMA en modo individual, lectura,
out dmabase+11, al ;autoinicializa
out dmabase+12, al ;reinicia primero/último flip-flop
mov ax, cs ;calcula 4 bits de orden alto de área de buffer
mov cl, 4
rol ax, cl

6- 111
out dmapage+2, al ;almacena en canal 3 página DMA de 64K
and al, 0F0h
add ax, offset wave ;obtiene offset de página
out dmabase+6, al ;saca direc. de inicio de buffer de forma de
onda
mov al, ah
out dmabase+6, al
mov ax, dwavcnt
mov wavcnt, ax ;saca cuenta byte DMA
out dmabase+7, al
mov al, ah
out dmabase+7, al
mov al, 3 ;desenmascara canal 3 DMA
out dmabase+10, al
ret
wavcnt dw dwavcnt ;cuenta byte forma de onda
bfrptr dw 0 ;apuntador buffer forma de onda
wave dw ? ;Área de buffer de forma de onda; aqui empiezan los valores
;DAC almacenados

6.4 Rendimiento del DMA

Un defecto del controlador 8237A en la tarjeta madre es que es muy lento. En la IBM PC original, la CPU
uso una frecuencia de 4.77 MHz, y el 8237A, el cual tenía una frecuencia de reloj máxima de 5 MHz, corría a
la misma velocidad. Comparado con la CPU, el DMA en esta máquina fue bastante rápido, dando una
transferencia de datos máxima de cerca de 1.5 MB/segundo. Cuando la PC AT con su 80286 de 8 MHz se
introdujo, los diseñadores decidieron conservar el 8237A, y por simplicidad, derivaron el reloj del DMA del
reloj de la CPU dividiendo esta señal de reloj por dos. Así en la PC AT, la transferencia en bytes del DMA
fue realmente menor que en la IBM PC. La única gracia fue que usaron los canales 5, 6 ó 7 para hacer
transferencias de 16 bits alcanzando velocidades hasta de 2.6 MB/segundo o aun 4 MB/segundo si el modo
de temporización comprimido esta disponible en el 8237A que se use. La temporización comprimida acorta
los pulsos MEMR' o IOR', sin embargo, debe usarse con cuidado porque no todos los dispositivos de
memoria o E/S lo soportan. Muchas PCs aun usan este reloj lento para el DMA porque deben usar
dispositivos E/S sobre el bus ISA, el cual fue originalmente diseñado para correr a 4.77 u 8 MHz.

Es tentador aumentar el rendimiento del DMA programándolo para hacer transferencias en el modo de
bloque. En este modo, el 8237 toma el bus de la CPU y no lo libera hasta que el bloque completo (el cual
puede ser de 64 ó 128 KB) se transfiere. Esto significa que se amarra el bus hasta por 50 milisegundos. Sin
embargo, el modo de bloque puede causar un problema fatal ya que la memoria principal DRAM debe
refrescarse cada 15 µseg, y el controlador de refresco debe tomar el control del bus para realizar ésto. Para
evitar perdida del contenido de la RAM, no se deben hacer transferencias en bloque. En lugar de eso parta la
transferencia en bloques más pequeños o use el modo de transferencia individual, lo que permite hacer el
refresco.

Con una PC 486 o Pentium, la CPU corre tan rápido que no tiene sentido usar DMA para muchas tareas. Por
ejemplo, el 8237 es capaz de hacer transferencia de memoria a memoria usando el canal 0 DMA para la
dirección fuente y el canal 1 para la dirección destino. Entonces el 8237A transfiere los datos con operaciones

6- 112
DMA de lectura y escritura sucesivas, usando su registro temporal interno para mantener los datos entre las
dos operaciones. Sin embargo, casi nunca tiene sentido hacer ésto porque la CPU puede hacer movimientos
de bloque de memoria a memoria mucho más rápido usando sus instrucciones de movimiento de cadenas.

Las operaciones E/S también se pueden hacer más rápido por la CPU (siempre que el dispositivo E/S pueda
manejar velocidades más rápidas) usando sus instrucciones de E/S para transferir datos entre memoria y
puertos E/S. De hecho, IBM uso esta aproximación para la interfase de disco duro en la PC AT, la cual no
usa el DMA del todo. Las situaciones en que DMA proporciona ventaja son aquellas en las que la velocidad
de datos es alta, pero esta limitada por el mismo dispositivo E/S a una velocidad que el controlador DMA
pueda manejar. El DMA se puede usar para hacer transferencia de datos, mientras la CPU se deja libre para
hacer otras cosas. Muchas tareas de adquisición de datos caen en esta categoría.

6- 113

También podría gustarte