Acceso Directo a Memoria (DMA) Una de las tareas más comunes

Anuncio
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.
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 Encoder) resuelve la contención de
prioridad entre los canales de DMA que solicitan servicio simultáneamente.
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 flipflop se reinicia por un “Master Clear” o Reinicio (Reset). Este flip-flop 6- 98
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.
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- 99 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- 100 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
1 = habilita
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 apuntar a dos bloques de
memoria diferente y se puede usar para 6- 101 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
canal 0
1 = habilita contenedor dirección
canal 0
X = si bit 0 = 0
Valido solo cuando la función del bit 0 se selecciona. Deshabilita la función de
incremento o decremento en el canal 0, permitiendo un patrón fijo para ser escrito en
un bloque de memoria. No se usa en la PC.
2 0 = habilita controlador
1 = deshabilita controlador
Habilita o deshabilita el controlador DMA
3 0 = tiempo normal
1 = tiempo comprimido
X = si bit 0 = 1
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 seleccionar este modo en la PC porque
puede reducir el tiempo de acceso a puerto E/S y memoria y causar una operación
invalida.
4 0 = prioridad fija
1 = prioridad rotada
Selecciona un modo de prioridad rotada. En la PC no se debe seleccionar porque el
canal 0 de refresco de memoria siempre debe tener la prioridad más alta.
5 0 = escritura retrasada
1 = escritura extendida
X = si bit 3 = 1
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 los ciclos de memoria dinámica del
sistema se disparan desde el 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
1 = DREQ sensa el activo bajo
Selecciona el nivel activo de las señales DREQ que llegan al
controlador. La PC selecciona nivel alto como activo.
7 0 = DACK sensa el activo bajo
1 = DACK sensa el activo bajo
Selecciona el nivel activo de las señales DACK enviadas por el
controlador. La PC selecciona nivel 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:
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.
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
00
1
Despeja bit de máscara de canal 0
Pone bit de máscara de canal 0
10
1
Despeja bit de máscara de canal 1
Pone bit de máscara de canal 1
20
1
Despeja bit de máscara de canal 2
Pone bit de máscara de canal 2
30
1
Despeja bit de máscara de canal 3
Pone bit de máscara de canal 3
456
7
X Condiciones sin importancia
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
01
10
11
Selecciona canal 0
Selecciona canal 1
Selecciona canal 2
Selecciona canal 3
2,3 00
01
Verifica Transferencia
Transferencia de escritura
6- 104
10
11
XX
Transferencia de lectura
Ilegal
Si bits 6 y 7 = 11
40
1
Deshabilita auto inicialización
Habilita auto inicialización
50
1
Selecciona incremento de dirección
Selecciona decremento de dirección
6,7 00
01
10
11
Selecciona modo de demanda
selecciona modo individual
Selecciona modo de bloque
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.
ï 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- 106
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 Flipflop Primero/Ultimo Interno se limpian y el Registro de Máscara se pone.
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
Esclavo
Canales 0-3
Puerto
Maestro
Canales 4-7
Lectura Escritura
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- 108
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- 109
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.
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
out
out
mov
out
mov
out
mov
out
mov
out
mov
out
out
al, 46h ;establece transferencia de un solo byte canal 2
dmabase+11, al ;Saca byte de modo
dmabase+12, al ;reinicia primero/último flip-flop
al,
bl ;saca offset de dirección dentro
dmabase+4, al ;de página DMA actual
al, bh
dmabase+4, al
al, 00 ;saca cuenta = 512
dmabase+5, al
al, 02
dmabase+5, al
al, DMA_PAGE ;almacena # pág. DMA de 64K en registro de pág.
dmapage+1, al ;de canal 2
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- 111 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- 112
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)
setransfiere. 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- 113
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.
Documentos relacionados
Descargar