Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Tecnología del PC

[Home]  [Inicio]  [Índice]


2.5  Puertos Entrada/Salida

Nota:  Para tener una visión de conjunto, antes de adentrarse en este apartado, dedicado a los puertos de E/S, es recomendable leer el epígrafe en que se tratan las Entradas/Salidas de forma genérica ( H2.1)

§1  Sinopsis

Cualquier dispositivo (distinto de la memoria RAM) que intercambie datos con el sistema lo hace a través de un "puerto", por esto se denominan también puertos de E/S ("I/O ports").  Desde el punto de vista del software, un puerto es una interfaz con ciertas características; se trata por tanto de una abstracción (no nos referimos al enchufe con el que se conecta físicamente un dispositivo al sistema), aunque desde el punto de vista del hardware, esta abstracción se corresponde con un dispositivo físico capaz de intercambiar información (E/S) con el bus.

Como los dispositivos E/S tienen algún tipo de conexión con el bus externo ( H2), deben tener una dirección (o conjunto de ellas) que los identifique.  Los hemos comparado con un teléfono, un dispositivo con el que se puede enviar/recibir información mediante una dirección.  Hablar de un puerto E/S es casi siempre sinónimo de una dirección, y es costumbre informática referirse a estas direcciones en hexadecimal ( 2.2.4b). De modo que, por ejemplo, un puerto puede ser 0x21 en un fuente o 21h en un texto informático.

Nota:  Al tratar de las E/S ( H2.1) hemos indicado que puerto es sinónimo de periférico; un dispositivo externo que comunica con el sistema a través de una dirección.  Sin embargo no todos son dispositivos externos a la placa-base, de hecho algunos dispositivos hardware incluidos en ella tienen la característica de "Puertos".  Por ejemplo, durante mucho tiempo algunos PC's disponían de un botón frontal señalado "Turbo", con el que se podía cambiar la velocidad de funcionamiento.  Este cambio de la velocidad del reloj también puede realizarse por software.  Basta para ello cambiar un par de bits en un "Puerto" instalado en la propia placa-base (generalmente en el rango 62-6Fh).

§2  Direcciones de puertos

El modelo de direccionamiento del PC ha adoptado dos modelos, según la naturaleza del dispositivo a conectar:  Direccionamiento dedicado para dispositivos de media/baja velocidad.  Por ejemplo, puertos serie y paralelo (impresora), teclado, Etc. y direccionamiento mapeado en memoria para dispositivos rápidos (típicamente los adaptadores gráficos).  En el apartado dedicado a E/S se explican las diferencias entre ambas modalidades ( H2.1)

§2.1  Respecto a los dispositivos de direccionamiento dedicado, desde la introducción del IBM-PC, es costumbre que determinados dispositivos muy comunes se conecten mediante puertos de direcciones determinadas.

Agunas direcciones (hex) de puertos en el PC XT/AT

Dispositivo

Dirección

Controlador DMAC#1 primario 8237A

000-00F

Controlador de interrupciones PIC#1 8259A

020-021

Temporizador programable PIT 8253 y 8254

040-043

Controlador periféricos PPI 8255 (XT)

060-063

Controlador 8742 (AT)

060-064

Altavoz del sistema

061-061

CMOS RAM & NMI Mask Reg (AT)

070-071

Registros de página DMA

081-08F

Controlador de interrupciones PIC#2 (AT)

0A0-0A1

NMI Mask register (XT)

0A2-0AF

Controlador DMAC#2 secundario (AT)

0C0-0DF

Clear / Reset del coprocesador matemático

0F0-0F1

Coprocesador matemático 80287

0F8-0FF

Controlador de disco duro (AT)

1F0-1FF

Puerto de juegos

200-20F

Unidad de expansión (XT)

210-21F

Ratón (conectado al bus)

238-23B

Ratón de bus alternativo

23C-23F

Puerto paralelo (LPT2)

278-27F

EGA (Enhanced Graphic Adapter)

2B0-2BF

EGA

2C0-2CF

EGA

2D0-2DF

GPIB Adaptador 0 (AT)

2E0-2E7

Puerto serie 8250 (COM4)

2E8-2EF

Puerto serie  8250 (COM2)

2F8-2FF

Tarjetas específicas (prototipos)

300-30F

Tarjetas específicas (prototipos)

310-31F

Controlador disco duro (XT)

320-32F

Tarjeta de red

360-363

Tarjeta de red

368-36B

Puerto paralelo (LPT1)

378-37F

SDLC  Puerto 2 [1]

380-38F

SDLC  Puerto 1

3A0-3AF

MDA (Monochrome Display Adapter)

3B0-3BB

Puerto paralelo (LPT3)

3BC-3BF

EGA

3C0-3CF

CGA

3D0-3DF

Puerto serie 8250 (COM3)

3E8-3EF

Controlador de disquete

3F0-3F7

Puerto serie 8250 (COM1)

3F8-3FF

En la tabla adjunta se muestran algunas de estas direcciones típicas para dispositivos de E/S [3].  Las referencias a los chips se refieren a los utilizados en los primeros PCs.  Actualmente han sido sustituidos por uno o dos integrados (Chipset) que realizan todas las funciones.

Puede observarse que para un mismo periférico se tienen varias direcciones (un "rango").  La razón es que estos dispositivos tienen varios registros y/o son programables, para lo que disponen de registros especiales (cada registro de un Byte tiene una dirección, y estas son correlativas).  Por ejemplo, el controlador de puerto serie de los primeros PCs era un circuito integrado 8250 de National Semiconductor; que 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 chip.

§2.1a  Respecto a las asignaciones "Estandar" de algunos puertos, es pertinente hacer algunas observaciones:

En realidad IBM definió de forma distinta las direcciones de puerto de las interfaces de impresora en los PC monocromo y en los de color.  Las asignaciones fueron las siguientes:

Puerto Monocromo Color
LPT1 3BC-3BFh 378-37Fh
LPT2 378-37Fh 278-27Fh
LPT3 278-27Fh

---

En lo referente a los puertos serie, durante la secuencia inicial de identificación del hardware ( 4.2), la BIOS realiza una búsqueda de dispositivos de E/S por direcciones en un orden determinado, y les asigna un nombre lógico según el orden de aparición.  En el caso de los puertos serie el orden suele ser el siguiente:

Puerto Dirección
COM1 3F8-3FFh
COM2 2F8-2FFh
COM3 3E8-3EFh
COM4 2E8-2EFh

§2.1b  Los usuarios de Windows 98 pueden comprobar la asignación de puertos del sistema mediante la utilidad msinfo032.exe (genralmente en el directorio C:\Archivos de programa\Archivos comunes\Microsoft Shared).  Los usuarios de Linux pueden consultarse en el fichero /proc/ioports mediante el comando

cat /proc/ioports

(lad direcciones de memoria están expresadas en hexadecimal). En la página adjunta se muestra el resultado de ambas utilidades en un caso concreto ( Ejemplo).:

§2.2  Las direcciones mapeadas en memoria se eligieron para algunos dispositivos como los adaptadores gráficos, que requerían mover grandes cantidades de datos muy rápidamente.

Con objeto de no causar conflictos con la RAM general, algunas de estas direcciones fueron mapeadas desde el principio por los diseñadores de IBM, fuera de la denominada memoria convencional ( H5.1).  Es decir, fuera del espacio de los 640 KB que podían utilizarse en los primeros PC's para Sistema y programas de aplicación.  Por ejemplo, el adaptador de video utiliza un área de memoria de 128 KB mapeada entre las direcciones A0000-BFFFFh.

Sin embargo, los decodificadores de direcciones de periféricos de los primitivos PC's solo podían utilizar direcciones de 10 bits para tales accesos, por lo que las direcciones de puertos estaban constreñidas a 210 (1 KB  0000-0400h).  En realidad el espacio era aún más pequeño, puesto que los primeros 256 Bytes estaban copados por algunos dispositivos de la placa-base, resultando que los dispositivos E/S debían ser mapeados en 768 Bytes.  Generalmente se utilizaron fragmentos de 256 Bytes en la forma xxF0-xxFFh, organizados de forma bastante desordenada.

La introducción del AT amplió estas direcciones a 16 [2].  Sin embargo, incluso los 64 KB resultantes eran un espacio pequeño y de organización caótica, dado que los nuevos dispositivos se construían de forma que fueran compatibles con las antiguas placas ISA que solo reconocían direcciones de 10 bits.  Incluso las placas para buses posteriores que fueron desarrollados pensando en 64 KB porque debían ser compatibles hacia atrás con las antiguas placas ISA (que coexistían en las nuevas).  El resultado de todo esto es que, incluso los sistemas actuales con muchos MB. de RAM, deben seguir lidiando con los puertos a través de pequeñas ventanas de memoria con localizaciones absurdas.

§3  Comunicar con los puertos

Nos detendremos brevemente en analizar los aspectos involucrados en las operaciones E/S con los puertos desde una doble vertiente:  Lógica y física; esta última relativa a los mecanismos involucrados en el intercambio.

§3.1  Aspectos lógicos

El software utilizado depende de la modalidad de direccionamiento (dedicado o mapeado) que se elija.  En el segundo caso, se dispone un amplio repertorio de recursos para mover datos entre los registros y la memoria (la mayoría de las instrucciones del procesador operan de esta forma), así como de los mecanismos auxiliares de transferencia, como el acceso directo a memoria DMA.

El panorama es distinto cuando se trata de puertos de direccionamiento dedicado.  En este caso, para realizar las operaciones E/S en los procesadores 8088 y descendientes, solo se dispone de dos instrucciones específicas:  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.  Ambas instrucciones permiten dos variaciones sintácticas:

IN acumulador-destino, direccion-de-puerto-origen
IN acumulador-destino, acumulador-origen
OUT dirección-de-puerto-destino, acumulador-origen
OUT acumulador-destino, acumulador-origen

Las dos primeras sitúan el dato contenido en el puerto origen en el acumulador-destino, que puede ser AX o AL.  Observe que el puerto puede ser expresado directamente mediante una dirección (hexadecimal) o mediante un acumulador-origen, que debe ser DX; en este caso, su contenido se toma como dirección del puerto que se lee.

Las instrucciones OUT sitúan el valor contenido en el acumulador-origen, que puede ser AX o AL, en el puerto destino, que puede ser identificado directamente mediante su dirección hexadecimal, o por el valor señalado por el acumulador-destino, que debe ser DX.

En el IBM-PC, las direcciones-de-puerto utilizadas en estas instrucciones estan en el rango 00-FFh, aunque en la práctica solo 00-F7h, porque Intel reserva las direcciones F8-FFh para el coprocesador metemático ( 0.3.2).  En cambio, si se utiliza la dirección contenida en el registro DX el rango de direcciones puede moverse en el rango 0000-FFFFh.

Por supuesto, cualquier programa que quiera utilizar puertos deberá emplear directa o indirectamente estas dos instrucciones ensamblador, aunque en muchos casos no es imprescindible enredarse en demasiados detalles.

Los usuarios de DOS pueden utilizar servicios del Sistema; concretamente la interrupción 21h que realiza operaciones de E/S con puertos (utilizando IN y OUT por supuesto).  Por ejemplo, las instrucciones:

MOV DL,7

MOV AH,2

INT 21

provocan un pitido en el sistema bajo DOS.  La explicación es la siguiente:  La última instrucción invoca una interrupción software ( H2.4) número 33 (21h) que, como hemos indicado, corresponde a los servicios del DOS.  Cuando esto ocurre, se comprueba el contenido del registro AH ( H3.2), que en este caso es 2 (valor previamente establecido en la segunda instrucción), lo que indica que debe escribirse un carácter en pantalla (un dispositivo de salida); en este caso, el carácter que se envía al puerto es el contenido del registro DL, que previamente se ha establecido en el valor 7 con la primera instrucción.  El 7 es el valor BELL ASCII ( 2.2.1a); cuando se intenta mostrar este carácter, se produce un pitido en el altavoz del sistema.

Los demás Sistemas disponen de utilidades análogas.  Por ejemplo, los sistemas Windows disponen de una DLL específica para este tipo de servicios.

§3.2  Aspectos físicos

El procedimiento que se sigue el procesador para las E/S hacia puertos, es siempre el mismo:  Poner el dato en el bus de datos y la dirección en el de direcciones.  Como indicamos a continuación, el sistema sabe que se trata de una dirección de memoria (real o de puerto mapeado) o de un puerto de dirección dedicada, y cual es la acción esperada (lectura o escritura) porque se dispone de 4 líneas específicas en el bus de control ( H2):

  • IOR       Orden de lectura para dispositivo E/S conectado al bus, que debe colocar un dato en el bus de datos.
  • IOW      Orden de escritura para dispositivo E/S, que debe leer el dato situado en el bus.
  • MEMR   Esta señal indica a los dispositivos de memoria que deben colocar un dato en el bus de datos.
  • MEMW  Señal que indica a los dispositivos de memoria que deben almacenar el dato colocado en el bus de datos.

Una cuestión adicional es que cuando la comunicación debe establecerse desde el lado del puerto (es el puerto el que desea establecer comunicación con el sistema), primero debe anunciarlo al procesador, para lo que se utiliza un sistema de interrupciones cuyo mecanismo de funcionamiento se ha detallado en el capítulo correspondiente ( H2.4).  La consecuencia es que la mayoría de los puertos disponen de líneas IRQ asignadas para este menester.

§4  Webografía

The x86 interrupt list    ftp.cs.cmu.edu/

Ver comentario en la página anterior ( 2.4).

  Inicio.


[1]  SDLC "Synchronous Data Link Control".  Controlador síncrono serie de alta velocidad. Generalmente utilizado en dispositivos de audio y comunicaciones.

[2]  El 8088 dispone de un bus de direcciones de 20 bits (A0-A19), pero durante las operaciones de E/S de puertos, las direcciones A16-A19 permanecen iguales a cero ( H3.2.1).

[3]  Aparte de posibles errores, si compara las direcciones de la tabla con las de otras páginas o publicaciones (u otras entre sí), comprobará que a veces existen pequeñas diferencias, en especial en los valores finales del rango.  La razón suele ser que se refieran al rango inicialmente destinado al dispositivo (que tiene la forma xxFF) o al que realmente utiliza el dispositivo concreto (que en ocasiones no agota el rango reservado inicialmente).