# E/S mapeada en memoria

E/S mapeada en memoria y E/S independiente son dos métodos de implementar entradas/salidas entre los periféricos y la CPU en un computador. Otro método, no discutido en este artículo, es usar DMA.
La E/S mapeada en memoria usa el mismo bus de direcciones para memoria y dispositivos de E/S, y las instrucciones de la CPU usadas para acceder a la memoria son también usadas para acceder a los dispositivos.
Para tener espacio para los dispositivos de E/S, las áreas del espacio direccionable por la CPU deben ser reservadas para E/S más que para memoria. Esta reserva puede ser temporal (Commodore 64 podía conmutar entre el banco de dispositivos de E/S y un banco de memoria) o permanente. Cada dispositivo de E/S monitoriza el bus de direcciones de la CPU y responde a cualquier acceso de esta al espacio de direcciones del dispositivo, conectando el bus de datos con la localización en memoria física del dispositivo deseado.
La E/S independiente usa un tipo especial de instrucciones de la CPU para implementar E/S. Principalmente en microprocesadores Intel encontramos las instrucciones IN y OUT que pueden leer y escribir un único byte en un dispositivo de E/S. Estos tienen un espacio de direcciones separadas de la memoria, llevado a cabo o bien por un "pin E/S” extra en la CPU o bien por un bus entero dedicado a E/S.
Un dispositivo de acceso directo a memoria (DMA) no se ve afectado por estos métodos de comunicación CPU-dispositivo, especialmente por la E/S mapeada en memoria. Esto es porque, por definición, DMA es un método de comunicación memoria-dispositivo que evita la CPU.
Una interrupción hardware es otro método de comunicación entre CPU y periféricos. No obstante, se trata siempre separadamente por múltiples razones. Es un iniciador de dispositivo, en oposición a los métodos iniciadores de CPU. Es también unidireccional, pues la información fluye solo del dispositivo a la CPU. Para terminar cada interrupción lleva consigo misma solo un bit de información con la única intención de notificar la interrupción.

## Ventajas de ambos métodos de E/S

La principal ventaja de usar E/S independiente se aprecia en CPUs con limitada capacidad de direccionamiento. Debido a que la E/S independiente separa el acceso a E/S del acceso a memoria, el espacio de direcciones puede ser usado por completo para esta última.
Si los buses de datos y direcciones son compartidos, las operaciones de E/S pueden ralentizar los accesos a memoria. Esto se debe a que los accesos a E/S suelen ser mucho más lentos que los accesos a la memoria principal. En algunas arquitecturas, la E/S independiente opera con un bus dedicado, solventando así este inconveniente.
La ventaja de usar E/S mapeada en memoria es que, dejando a un lado la complejidad extra que conlleva la E/S independiente, la CPU requiere menos lógica interna y por ende más barata, rápida y fácil de construir; esto sigue los principios básicos de RISC, y es también ventajoso en sistemas embebidos. El hecho de que instrucciones regulares de memoria sean usadas para direccionar a E/S también significa que todos los modos de direccionamiento de la CPU que están disponibles para memoria lo estén también para E/S. Ya que los periféricos de 16 bits han quedado anticuados y han sido sustituidos por los de 32 y 64 bits, reservar rangos del espacio de direcciones para E/S no supone un gran problema.

## Ejemplo

Considerar un sistema construido alrededor de un microprocesador de 8 bits. Dicha CPU tendrá un bus de direcciones de 16 bits, permitiendo direccionar 64 kilobytes (KB) de memoria. En este sistema, los primeros 32 KB del espacio de direcciones serían asignados a la memoria, otros 16 KB a la ROM y el espacio restante a dispositivos como temporizadores, contadores, chips de visualizadores de video, dispositivos generadores de sonido, etc. El hardware de este sistema está organizado de forma que los dispositivos únicamente responderán a direcciones particulares del bus de direcciones, las cuales serán previstas para ellos. Todas las demás direcciones serán ignoradas. Este es el trabajo del decodificador de direcciones, y será lo que establezca el mapa de memoria del sistema.
De esta forma tendríamos un mapa de memoria como el siguiente:
| Dispositivo | Rango de direcciones (hexadecimal) | Tamaño |
| RAM | 0000 - 7FFF | 32 KiB |
| E/S de propósito general | 8000 - 80FF | 256 bytes |
| Controlador de sonido | 9000 - 90FF | 256 bytes |
| Controlador de video/text-mapped display RAM | A000 - A7FF | 2 KiB |
| ROM | C000 - FFFF | 16 KiB |
Nótese que este mapa de memoria contiene lagunas, lo cual es bastante común.
Asumiendo que el cuarto registro del controlador de video establece el color de fondo de la pantalla, la CPU podrá establecer este color escribiendo un valor en la posición A003 usando su instrucción de escritura estándar. Usando el mismo método gráficos pueden ser visualizados en pantalla escribiendo valores de caracteres en una área especial de la RAM dentro del controlador de video. Debido a su bajo coste la RAM permitirá visualizadores de bits mapeados.

## Tipos básicos de decodificación de direcciones

* Exhaustivo – 1:1 – Una única dirección para acceder a una localización en memoria física.
* Parcial – n: 1 – Un conjunto único de n direcciones para referenciar a una localización en memoria física. Esto tiene la ventaja de que simplifica el hardware de decodificación y los inconvenientes de, como ya hemos dicho antes, usar varias direcciones para una misma palabra, no detectar direcciones no implementadas y dificultar las modificaciones.
* Lineal - Las líneas de direcciones son usadas directamente sin lógica de decodificación alguna.

## Decodificación de direcciones incompleta

Las direcciones pueden ser decodificadas completa o incompletamente por un dispositivo.
* La decodificación completa conlleva chequear cada línea del bus de direcciones, comunicando el bus de datos con la localización en memoria física correspondiente.
* La decodificación incompleta o parcial usa lógica más simple y normalmente más barata que examina solo algunas líneas del bus de direcciones.Este simple circuito de decodificación permite a un dispositivo responder a varias direcciones diferentes, creando copias virtuales del dispositivo en lugares diferentes del mapa de memoria. Todas estas copias se refieren al mismo dispositivo real, así que no hay una principal ventaja haciendo esto, excepto la simplificación del decodificador. Comúnmente, la descodificación es programable, así el sistema puede reconfigurar su propio mapa de memoria como lo necesite.
* Datos: Q891094