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.