Memory-Mapped I/O (MMIO) es un método fundamental en la arquitectura de computadoras que permite a la CPU interactuar con dispositivos periféricos. En lugar de utilizar instrucciones de E/S especiales (como en Port-Mapped I/O), MMIO asigna un rango de direcciones de memoria virtual a los registros de control y buffers de datos de un dispositivo hardware. Esto significa que el software puede leer y escribir en estos registros como si fueran ubicaciones de memoria RAM normales, utilizando las mismas instrucciones de carga (LOAD) y almacenamiento (STORE) que se usan para acceder a la memoria principal. El controlador de memoria (Memory Controller) o la unidad de gestión de memoria (MMU) se encarga de redirigir estas solicitudes de acceso a la memoria física del dispositivo en lugar de a la RAM principal, simplificando la programación y la arquitectura del sistema.
MMIO es omnipresente en sistemas modernos. Las tarjetas gráficas (GPUs) son un ejemplo prominente; sus VRAM y registros de control son accesibles vía MMIO, permitiendo al sistema operativo y a las aplicaciones configurar modos de pantalla, cargar texturas y enviar comandos de renderizado. Controladores de red (NICs), controladores de almacenamiento (como NVMe SSDs), y la mayoría de los periféricos en un bus PCI Express (PCIe) utilizan MMIO para su configuración y transferencia de datos. Incluso los registros de configuración de la CPU y los controladores de interrupción programables (APIC) a menudo se exponen a través de MMIO. En sistemas embebidos, los microcontroladores utilizan MMIO para acceder a sus periféricos internos como GPIOs, UARTs, SPI, I2C, y ADCs.
Para un arquitecto de sistemas, MMIO es crucial por varias razones. Primero, simplifica el modelo de programación al unificar el acceso a memoria y E/S, lo que puede reducir la complejidad del código del controlador de dispositivo. Sin embargo, introduce consideraciones importantes sobre la coherencia de caché (Cache Coherency): los accesos a MMIO generalmente deben ser 'non-cacheable' o 'write-through' para asegurar que la CPU siempre interactúe con el estado actual del hardware y evitar problemas de datos obsoletos en la caché. La latencia es otro factor; los accesos a MMIO pueden ser significativamente más lentos que los accesos a RAM debido a la lógica adicional y la posible contención en el bus del sistema. La asignación de direcciones MMIO también es un desafío de diseño, ya que requiere una gestión cuidadosa del espacio de direcciones para evitar conflictos. Comprender MMIO es fundamental para diseñar sistemas de alto rendimiento, especialmente aquellos que interactúan intensamente con hardware especializado o que requieren baja latencia en la comunicación con periféricos.