05 Entrada Salida
05 Entrada Salida
05 Entrada Salida
1 Sinopsis
Si consideramos que el núcleo del ordenador está constituido por la placa-base y los elementos montados en ella
(los elementos que podemos llamar "internos"), y que el resto de los dispositivos conectados son "externos",
entonces podemos considerarlas dos tipos de comunicaciones o transferencias de información [1]:
Debemos recordar aquí que las operaciones E/S en las que interviene la memoria, son abrumadoramente más
importantes y frecuentes que las del resto, por lo que el PC les da un tratamiento especial; disponen de un
subsistema específico en el bus, y el tratamiento software también es especial (el procesador dispone de un
montón de instrucciones específicas para controlar las operaciones con la memoria). Nosotros le hemos dedicado
un capítulo específico ( H2.3). En consecuencia, aquí nos referiremos principalmente a las E/S con otros
dispositivos hardware.
En general los procesos de E/S pueden ser de tres tipos según la forma en que se inician y controlan:
Este método es utilizado intensivamente en la programación actual, y es la base del funcionamiento de los
procesadores modernos, por lo que le dedicamos un capítulo ( H2d). La esencia del método consiste en que el
periférico que desea establecer comunicación, dispone de un canal especial ("casi" siempre abierto) para
solicitarla al procesador. Cuando el procesador recibe esta señal, que se denomina petición de interrupción,
termina la instrucción que esté en ejecución y atiende al periférico. Es el sistema más eficiente para atender a
periféricos de velocidad media, o cuando hay que atender a gran número de ellos.
Los sistemas anteriores tienen el inconveniente de que cualquiera que sea el procedimiento por el que se inicia la
E/S, es el procesador el que debe atenderla. Sin embargo, hay ocasiones, en especial cuando se trata de
transferencias de datos entre periféricos rápidos y memoria (por ejemplo discos), en que se alcanza una mayor
eficacia dejando al procesador al margen del proceso (la cuestión tiene cierta lógica pues al fin y al cabo, el asunto
no va con él). Estos procesos se conocen como acceso directo a memoria DMA ("Direct Memory Access"), y
exigen dos requisitos:
I- El procesador debe ser capaz de dejar libre el bus de datos para que otro dispositivo tome su
control, limitándose mientras tanto a esperar.
II- Otro dispositivo debe tomar el control del bus ("bus mastering"), para controlar él mismo el
proceso.
En el PC se cumplen ambas condiciones. Al tratar la arquitectura de los procesadores 8088 y siguientes, veremos
que disponen de tres patillas específicas para atender al primer punto ( H3b1). Además hemos señalado que la
placa base dispone de un chip específico, el controlador de acceso directo a memoria DMAC ("DMA
Controller"), así como ciertas líneas dedicadas en el propio bus de control. En el capítulo correspondiente (
H2.3) se expone con más detalle el funcionamiento de esta modalidad muy utilizada e importante en la
arquitectura de sistemas actual.
Hemos visto que, incluso en el caso de dispositivos externos o periféricos, al final las transferencias de datos
suponen siempre el paso de estos por el bus del sistema. En este sentido el bus es una línea a la que se
conectan cierto número de dispositivos y todos pueden "ver" o escuchar los datos que pasan. Adicionalmente
también casi todos ellos pueden "escribir" o depositar datos en esta línea. Por supuesto este canal no es un
galimatías o un patio de vecinos en el que todos hablan cuando les parece. Las transmisiones están
sincronizadas por el tic-tac del reloj del sistema ( H2). Además existe siempre un árbitro, generalmente el
procesador, que actúa como el director de un debate, concediendo la palabra al dispositivo adecuado [4].
3.1 Puertos E/S
La organización y control del tráfico es posible porque los dispositivos conectados al bus se construyen de forma
que, aunque están a la escucha de los datos que circulan por él, solo reaccionan cuando la dirección existente en
ese momento en el bus de direcciones tiene un valor concreto. Esta "dirección" puede ser un valor único
(raramente) o cualquiera dentro de un rango de valores contiguos. En estas circunstancias, y dependiendo de la
dirección y del estado de otras líneas, el dispositivo puede escribir un dato en el bus de datos, o leer el que exista
en ese momento en el bus. En el resto de casos, el dispositivo sencillamente ignora lo que sucede en el bus. Por
ejemplo, la interfaz del teclado solo reacciona cuando el bus contiene direcciones entre 60h y 6Fh inclusive.
Cada una de estas direcciones es lo que se conoce como un puerto E/S ("I/O port") y viene a ser como la
"dirección" del dispositivo. El principio de funcionamiento es que cuando el dispositivo ve que el dato en el bus de
direcciones se refiere a él, realiza una acción determinada. Por ejemplo, poner o leer un dato en el bus de datos.
Como veremos a continuación, cuando un dispositivo responde a un rango de direcciones, cada dirección tiene
distinto uso.
Como puede verse, referirse a un puerto E/S equivale a referirse a un dispositivo concreto y los intercambios de
información con los dispositivos de E/S, se realizan como en el resto de los casos utilizando direcciones. De modo
que cuando el sistema necesita dirigirse a un "puerto", utiliza una dirección. En este sentido, el procedimiento es
análogo al utilizado para intercambios de datos entre el procesador y la memoria o entre direcciones de memoria,
aunque en este último caso, el procesador dispone de un amplio abanico de instrucciones que permiten mover y
operar directamente entre registros y direcciones de memoria, frente a solo dos (las instrucciones IN y OUT)
cuando estas operaciones se realizan entre registros y direcciones de puertos [2].
Tanto si la transferencia es con una posición de memoria como con un puerto, la forma de operar es siempre la
misma; poner el dato en el bus de datos y la dirección en el de direcciones. El sistema sabe que se trata de una
dirección de memoria o de puerto y cual es la acción esperada (lectura o escritura) porque se dispone señales
adecuadas en las patillas del procesador, que tienen su prolongación en el bus de control ( H3.2.1). Aunque las
direcciones de periféricos son coincidentes (en valor) con las de memoria, no hay posibilidad de confusión porque
los elementos conectados al bus (memoria y periféricos) saben cuando un dato se dirige a unas u otros por el
estado de las mencionadas líneas.
3.1 Direccionamiento dedicado
Como se ha señalado, el acceso a puertos de direccionamiento dedicado se realiza exclusivamente mediante dos
instrucciones, IN y OUT. La primera lee un byte del registro de salida del puerto y lo sitúa en un registro del
procesador; la segunda escribe el contenido de un registro del procesador en un registro del puerto. Nos
referimos a ellas más detenidamente en el epígrafe dedicado a los puertos E/S ( H2e)
Desde la introducción del primer IBM PC era costumbre que determinados dispositivos muy comunes se
conectasen mediante puertos de direcciones determinadas. También hay que reseñar que un mismo periférico
puede tener varias direcciones (de hecho es rarísimo que tenga menos de dos). La razón es que estos
dispositivos tienen varios registros (cada registro es una dirección de 1 Byte). Normalmente uno o varios son
direcciones de lectura/escritura de datos desde/hacia el dispositivo, mientras que otros (que pueden ser de solo
escritura), sirven para programar el dispositivo. Por ejemplo, el controlador de puerto serie, que suele ser un
chip 8250, dispone de 8 registros. Aunque los datos se reciben y transmiten por uno de ellos, el resto sirve para
programar y controlar el funcionamiento del dispositivo (poner el control de paridad, la velocidad de transmisión, el
número de bits de datos, número de bits de parada, Etc.)
Una alternativa al método anterior consiste en construir los dispositivos periféricos de forma que sus registros
internos respondan como direcciones de memoria. Este sistema se denomina de direccionamiento mapeado en
memoria, y presenta indudables ventajas. La principal es que se dispone de todo el amplio arsenal de
instrucciones para manipular datos entre estas posiciones y los registros del procesador. Es un método
especialmente adecuado para manejo de periféricos rápidos, o que tengan gran cantidad de registros internos. Un
caso paradigmático lo constituyen los controladores de video, que deben almacenar grandes cantidades de
información, que además debe ser movida a gran velocidad.
Naturalmente esta solución requiere que los registros del dispositivo se comporten exactamente como lo hace la
memoria. Es decir, deben responder como auténticas direcciones de memoria RAM. Observe que esto no es lo
usual en determinados periféricos. Por ejemplo; un ratón o un teclado no conservan la información que se pudiera
escribir en ellos; además su contenido dependería del movimiento o de las pulsaciones de teclas realizadas por el
operador.
Otra condición no menos importante, es que los registros deben ser suficientemente rápidos para que puedan ser
equiparadas a la velocidad de acceso de la RAM. Observe que en este caso, el procesador no distingue
realmente entre la dirección de auténtica RAM y las direcciones que corresponden a un periférico. Por ejemplo, en
el caso de un controlador de video el procesador escribe en unas determinadas posiciones de memoria y el
resultado es mostrado automáticamente en la pantalla del monitor.
El sistema tiene la ventaja de que los periféricos se manejan de forma unificada dentro del espacio general de
direcciones de memoria, y que se dispone de los recursos propios del manejo de la memoria, entre ellos el
mecanismo de acceso directo DMA , con lo que determinados movimientos pueden efectuarse casi sin
intervención del procesador. Por ejemplo, intercambios entre la memoria de video y el disco. Sin embargo, el
sistema presenta también evidentes inconvenientes. El primero y principal es que estas direcciones,
denominadas direcciones I/O, quedan excluidas de su posible utilización como auténtica RAM de propósito
general.
Nota: En los sistemas actuales de 32 bits, con varios GBytes de memoria virtual ( H5a) direccionables en
un único espacio contiguo, esto no representa un serio inconveniente. Pero en los primeros equipos, con solo
unas cuantas KB de RAM, el sistema de periféricos mapeados en memoria representaba una auténtica
dificultad.
[1] Como casi todas las clasificaciones, esta que proponemos es un tanto artificiosa y representa solo uno de los
muchos puntos de vista de la cuestión, sin embargo puede servir para situar al lector en el problema y para
facilitarle una imagen de los mecanismos involucrados.
[2] Nos referimos al procesador 8088 instalado en los primeros PC's. Los descendientes de esta saga han
ampliado considerablemente el abanico de instrucciones que pueden manejar, pero en cualquier caso, la
superioridad es abrumadora para las instrucciones registro/memoria frente a las instrucciones registro/puerto.
[3] Como veremos al tratar de las interrupciones ( H2d), también disponían de varias opciones para seleccionar
la línea IRQ que debía usar el periférico.
[4] Veremos a continuación que el procesador puede ceder momentáneamente el control del bus a otros
dispositivos.
[5] Esta forma de identificación se utiliza principalmente en la interfaz ("Shell") del Sistema Operativo y en los
lenguajes script que la manejan. También en algunos lenguajes de alto nivel.