Intel 8237 es un controlador de acceso directo a memoria (DMA) que forma parte de la familia de microprocesadores MCS 85. Permite la transferencia de datos entre la memoria y la E/S con una carga reducida en el procesador principal del sistema, proporcionando a la memoria señales de control e información de dirección de memoria durante la transferencia DMA.
El 8237 es un dispositivo de cuatro canales que se puede ampliar para incluir cualquier cantidad de entradas de canal DMA. El 8237 es capaz de realizar transferencias DMA a velocidades de hasta 1,6 megabytes por segundo. Cada canal es capaz de direccionar una sección completa de 64k bytes de memoria y puede transferir hasta 64k bytes con una sola programación. [1]
En el IBM PC original y en el IBM XT se utilizó un único 8237 como controlador DMA . El IBM PC AT añadió otro 8237 en configuración maestro-esclavo, aumentando el número de canales DMA de cuatro a siete. [2] Las computadoras personales IBM compatibles posteriores pueden tener conjuntos de chips que emulan las funciones del 8237 para compatibilidad con versiones anteriores. El Intel 8237 fue diseñado en realidad por AMD (llamado Am9517 [3] ). Fue parte de un acuerdo de licencia cruzada, que permitía a AMD fabricar procesadores Intel, que hizo que el diseño también estuviera disponible para Intel. Es por eso que el paquete de Intel tiene impreso "(C) AMD 1980". El 8237, que funciona a 3 MHz y 5 MHz, fue fabricado por Intel como se describe en las variantes, mientras que NEC ha desarrollado el μPD71037, una versión que funciona a 10 MHz. [4]
El 8237 funciona en cuatro modos diferentes, según la cantidad de bytes transferidos por ciclo y la cantidad de circuitos integrados utilizados:
Se puede realizar una transferencia de memoria a memoria. Esto significa que los datos se pueden transferir de un dispositivo de memoria a otro. El registro de dirección actual del canal 0 es la fuente de la transferencia de datos y el registro de recuento de palabras actual del canal 1 finaliza cuando se convierte en 0. El canal 0 se utiliza para la actualización de la DRAM en los equipos IBM PC compatibles. [5]
En el modo de inicialización automática, los valores de dirección y de conteo se restauran al recibir una señal de fin de proceso (EOP). Esto sucede sin ninguna intervención de la CPU. Se utiliza para repetir la última transferencia. [5]
El contador de terminales (TC) señala el final de la transferencia a las tarjetas ISA. Al final de la transferencia se producirá una inicialización automática configurada para ello.
En el modo simple, solo se transfiere un byte por solicitud. Para cada transferencia, el registro de conteo se decrementa y la dirección se incrementa o decrementa según la programación. Cuando el registro de conteo llega a cero, la señal TC de conteo terminal se envía a la tarjeta. [6] [7]
La solicitud DMA DREQ debe ser generada por la tarjeta y mantenida activa hasta que sea reconocida por el reconocimiento DMA DACK . [6]
La transferencia se activa mediante el DREQ , que puede desactivarse una vez que DACK lo reconoce. La transferencia continúa hasta que se activa el EOP de fin de proceso (ya sea interno o externo), lo que activará el recuento de terminales TC en la tarjeta. La inicialización automática se puede programar en este modo. [6]
La transferencia se activa mediante DREQ y DACK la reconoce y continúa hasta que TC , EOP externo o DREQ se desactivan. Solo TC o EOP externo pueden activar la inicialización automática si está programada. [6]
Los registros internos utilizados en el 8237 para la transferencia de datos son los siguientes:
Como miembro de la familia de dispositivos Intel MCS-85, el 8237 es un dispositivo de 8 bits con direccionamiento de 16 bits. Sin embargo, es compatible con los microprocesadores 8086/88 . Los modelos IBM PC y PC XT (tipos de máquina 5150 y 5160) tienen una CPU 8088 y una arquitectura de bus de sistema de 8 bits; este último se conecta directamente al 8237, pero el 8088 tiene un bus de dirección de 20 bits, por lo que se agregan cuatro pestillos de dirección de 4 bits adicionales (todos en realidad parte de un solo dispositivo 74LS670), uno para cada canal DMA, junto con el 8237 para aumentar los contadores de dirección. Sin embargo, debido a que estos pestillos externos están separados de los contadores de dirección del 8237, nunca se incrementan o decrementan automáticamente durante las operaciones DMA, lo que hace imposible realizar una operación DMA en un límite de dirección de 64 KiB. Los intentos de cruzar un límite de 64 KiB en una transferencia DMA se completarán dentro de un bloque de memoria de 64 KiB. (Por ejemplo, si un canal DMA y el pestillo de dirección asociado se programaran para transferir 256 bytes a direcciones ascendentes comenzando en la dirección 0x3FF8C, en lugar de transferir a las direcciones 0x3FF8C a 0x4008B, los datos se transferirían a las direcciones 0x3FF8C a 0x3FFFF y luego a las direcciones 0x30000 a 0x3008B).
El IBM PC AT (tipo de máquina 5170) y los 100% compatibles utilizan una CPU 80286 y una arquitectura de bus de sistema de 16 bits. Además del 8237 de los modelos PC y XT, se añade un segundo 8237 en cascada para transferencias DMA de 16 bits. Esto es posible, a pesar de que el 8237 es un dispositivo de 8 bits, porque el 8237 realiza transferencias entre un puerto de E/S y la memoria como transferencias "fly-by" en las que los datos se colocan en el bus por la memoria de origen o el puerto de E/S y se leen directamente al mismo tiempo por el puerto de E/S o la memoria de destino, sin que el 8237 los gestione. Para este modo de transferencia, el ancho del bus de datos es esencialmente irrelevante para el 8237 (siempre que esté conectado a un bus de datos de al menos 8 bits de ancho, para programar los registros del 8237). El segundo 8237 en un PC de clase AT proporciona tres canales DMA de 16 bits (sus canales 1 a 3, denominados canales 5 a 7 en el PC AT); su canal 0 (denominado canal 4 en el PC AT) se utiliza en modo cascada para conectar el 8237 para DMA de 8 bits como "esclavo" en la disposición en cascada; el 8237 que proporciona los canales de 16 bits es el "maestro". Para que pueda direccionar palabras de 16 bits, está conectado al bus de direcciones de tal manera que cuenta direcciones pares (0, 2, 4, ...) en lugar de direcciones individuales. Al igual que el primer 8237, está aumentado con cuatro registros de extensión de direcciones. En un PC de clase AT, los ocho registros de aumento de direcciones tienen 8 bits de ancho, de modo que se pueden especificar direcciones completas de 24 bits (el tamaño del bus de direcciones del 80286). Las transferencias DMA en cualquier canal aún no pueden cruzar un límite de 64 KiB. (El DMA de 16 bits está limitado a 32.768 palabras de 16 bits, aunque un canal DMA puede contar hasta 65.536 direcciones; el bit más significativo del contador de direcciones de un canal DMA de 16 bits se ignora). Debido a que el modo DMA de memoria a memoria del 8237 funciona transfiriendo un byte desde la ubicación de memoria de origen a un registro temporal interno de 8 bits en el 8237 y luego desde el registro temporal a la ubicación de memoria de destino, este modo no se podría utilizar para el DMA de memoria a memoria de 16 bits, ya que el registro temporal no es lo suficientemente grande. Además, el DMA de memoria a memoria de 16 bits requeriría el uso del canal 4, lo que entraría en conflicto con su uso para conectar en cascada el 8237 que maneja los canales DMA de 8 bits. Sin embargo, en el AT, el canal DMA 0 de 8 bits ya no se utiliza para la actualización de DRAM, habiendo sido reemplazado por una lógica de actualización especializada, por lo que debería ser posible realizar DMA de memoria a memoria de 8 bits utilizando los canales 0 y 1 sin interrumpir la actualización de DRAM.
El diseño del DMA basado en 8237 en los PC compatibles con AT no se actualizó con el paso a las CPU de 32 bits y las arquitecturas de bus de sistema de 32 bits. En consecuencia, una limitación de estas máquinas es que los controladores DMA 8237 con sus registros de extensión de "página" de dirección acompañantes sólo pueden direccionar 16 MiB de memoria, según el diseño original orientado en torno a la CPU 80286, que a su vez tiene esta misma limitación de direccionamiento. [8] Esto significa que para otras áreas de memoria, los datos tienen que ser transferidos primero por DMA desde el dispositivo de E/S a un búfer intermedio en los primeros 16 MiB del espacio de dirección física, y luego movidos a la memoria final por la CPU; o, en la otra dirección, deben ser transferidos desde la memoria inicial al búfer intermedio por la CPU antes de ser transferidos por DMA desde ese búfer al dispositivo de E/S. Esta técnica se llama "búfer de rebote" . En general, pierde cualquier beneficio de velocidad general asociado con DMA, pero puede ser necesario si se requiere acceder a un periférico mediante DMA debido a requisitos de tiempo exigentes o a la inflexibilidad de la interfaz del hardware.
En la serie de computadoras PS/2 , IBM actualizó el hardware DMA para admitir datos y direcciones de 32 bits en algunos sistemas con CPU 80386, pero lo hicieron reemplazando el 8237 por un nuevo diseño de controlador DMA. El nuevo diseño incluye un modo de compatibilidad 8237 para compatibilidad con versiones anteriores del PC AT.
Aunque este dispositivo no aparezca como un componente discreto en los sistemas informáticos personales modernos, sí aparece en los conjuntos de chips de controladores de sistemas. Por ejemplo, el PIIX integró dos controladores 8237 para DMA de bus ISA . [9] [10]