La E/S mapeada en memoria ( MMIO ) y la E/S mapeada en puerto ( PMIO ) son dos métodos complementarios para realizar operaciones de entrada/salida (E/S) entre la unidad central de procesamiento (CPU) y los dispositivos periféricos de un ordenador (a menudo, el acceso se realiza a través del chipset ). Un enfoque alternativo consiste en utilizar procesadores de E/S dedicados, conocidos comúnmente como canales en los ordenadores centrales , que ejecutan sus propias instrucciones .
La E/S mapeada en memoria utiliza el mismo espacio de direcciones para direccionar tanto la memoria principal [ a ] como los dispositivos de E/S . [ 1 ] La memoria y los registros de los dispositivos de E/S se mapean a (se asocian con) valores de dirección, por lo que una dirección de memoria puede referirse a una porción de RAM física o a la memoria y los registros del dispositivo de E/S. Por lo tanto, las instrucciones de la CPU utilizadas para acceder a la memoria (por ejemplo, MOV ...) también se pueden utilizar para acceder a los dispositivos. Cada dispositivo de E/S monitoriza el bus de direcciones de la CPU y responde a cualquier acceso de la CPU a una dirección asignada a ese dispositivo, conectando el bus del sistema al registro de hardware del dispositivo deseado , o utiliza un bus dedicado.
Para dar cabida a los dispositivos de E/S, algunas áreas del bus de direcciones utilizado por la CPU deben reservarse para E/S y no deben estar disponibles para la memoria física normal; el rango de direcciones utilizado para los dispositivos de E/S viene determinado por el hardware. La reserva puede ser permanente o temporal (como se logra mediante la conmutación de bancos ). Un ejemplo de esto último se encuentra en el Commodore 64 , que utiliza una forma de mapeo de memoria para que la RAM o el hardware de E/S aparezcan en el rango 0xD000– .0xDFFF
La E/S mapeada por puerto suele utilizar una clase especial de instrucciones de CPU diseñadas específicamente para realizar E/S, como las instrucciones iny outque se encuentran en los microprocesadores basados en la arquitectura x86 . Diferentes formas de estas dos instrucciones pueden copiar uno, dos o cuatro bytes ( outb, outwy outd, respectivamente) entre el registro EAX o una de las subdivisiones de ese registro en la CPU y una dirección de puerto de E/S específica que se asigna a un dispositivo de E/S. Los dispositivos de E/S tienen un espacio de direcciones separado de la memoria general, ya sea mediante un pin "E/S" adicional en la interfaz física de la CPU o un bus completo dedicado a la E/S. Debido a que el espacio de direcciones para la E/S está aislado del de la memoria principal, a veces se hace referencia a esto como E/S aislada. [ 2 ] En la arquitectura x86, el par índice/dato se utiliza a menudo para la E/S mapeada por puerto. [ 3 ]
Descripción general
Los distintos métodos de comunicación entre la CPU y el dispositivo, como la asignación de memoria, no afectan al acceso directo a memoria (DMA) de un dispositivo, ya que, por definición, el DMA es un método de comunicación entre la memoria y el dispositivo que omite la CPU.
Las interrupciones de hardware son otro método de comunicación entre la CPU y los dispositivos periféricos; sin embargo, por diversas razones, siempre se tratan de forma independiente. Una interrupción se inicia desde el dispositivo, a diferencia de los métodos mencionados anteriormente, que se inician desde la CPU. Además, es unidireccional, ya que la información fluye únicamente del dispositivo a la CPU. Por último, cada línea de interrupción contiene un único bit de información con un significado fijo: «se ha producido un evento que requiere atención en un dispositivo conectado a esta línea de interrupción».
Las operaciones de entrada/salida pueden ralentizar el acceso a la memoria si se comparten los buses de direcciones y datos. Esto se debe a que el dispositivo periférico suele ser mucho más lento que la memoria principal. En algunas arquitecturas, la entrada/salida mapeada por puertos funciona mediante un bus de entrada/salida dedicado, lo que soluciona el problema.
Una ventaja de la E/S mapeada en memoria es que, al descartar la complejidad adicional que aporta la E/S de puerto, una CPU requiere menos lógica interna y, por lo tanto, es más barata, más rápida, más fácil de construir, consume menos energía y puede ser físicamente más pequeña; esto sigue los principios básicos de la computación con conjunto de instrucciones reducido y también es ventajoso en sistemas embebidos . La otra ventaja es que, dado que se utilizan instrucciones de memoria regulares para direccionar dispositivos, todos los modos de direccionamiento de la CPU están disponibles tanto para la E/S como para la memoria, y las instrucciones que realizan una operación ALU directamente sobre un operando de memoria (cargar un operando desde una ubicación de memoria, almacenar el resultado en una ubicación de memoria o ambas) también se pueden utilizar con los registros de los dispositivos de E/S. Por el contrario, las instrucciones de E/S mapeadas a puertos suelen ser muy limitadas, y a menudo solo permiten operaciones simples de carga y almacenamiento entre los registros de la CPU y los puertos de E/S. Por ejemplo, para sumar una constante a un registro de dispositivo mapeado a un puerto se necesitarían tres instrucciones: leer el puerto en un registro de la CPU, sumar la constante al registro de la CPU y escribir el resultado de vuelta al puerto.
Dado que los procesadores de 16 bits han quedado obsoletos y han sido reemplazados por procesadores de 32 y 64 bits , reservar rangos de espacio de direcciones de memoria para E/S ya no representa un problema, puesto que el espacio de direcciones de memoria del procesador suele ser mucho mayor que el espacio requerido para todos los dispositivos de memoria y E/S del sistema. Por lo tanto, resulta más práctico aprovechar las ventajas de la E/S mapeada en memoria. Sin embargo, incluso cuando el espacio de direcciones ya no es una preocupación importante, ningún método de mapeo de E/S es universalmente superior al otro, y habrá casos en los que el uso de E/S mapeada por puerto siga siendo preferible.
x86
La E/S mapeada en memoria es la preferida en las arquitecturas basadas en IA-32 y x86-64 porque las instrucciones que realizan E/S basadas en puertos están limitadas a un solo registro: EAX, AX y AL. La dirección del puerto se determina mediante un valor inmediato de tamaño de byte en la instrucción o un valor en el registro DX. [ 4 ] [ 5 ] En cambio, cualquier registro de propósito general puede enviar o recibir datos hacia o desde la memoria y los dispositivos de E/S mapeados en memoria; la E/S mapeada en memoria utiliza menos instrucciones y puede ejecutarse más rápido que la E/S de puerto. AMD no extendió las instrucciones de E/S de puerto al definir la arquitectura x86-64 para admitir puertos de 64 bits, por lo que no se pueden realizar transferencias de 64 bits utilizando la E/S de puerto. [ 6 ]
En las plataformas Intel más recientes, a partir de la serie 5 de 2008 , los dispositivos de E/S en el chipset se comunican directamente a través de un bus de interfaz de medios directos (DMI) dedicado. [ b ] [ 7 ]
barreras de memoria
Dado que las cachés median los accesos a las direcciones de memoria, los datos escritos en diferentes direcciones pueden llegar a la memoria o los registros de los periféricos fuera del orden del programa; es decir, si el software escribe datos en una dirección y luego escribe datos en otra dirección, el búfer de escritura de la caché no garantiza que los datos lleguen a los periféricos en ese orden. [ 8 ] Cualquier programa que no incluya instrucciones de vaciado de caché después de cada escritura en la secuencia puede experimentar efectos de E/S no deseados si un sistema de caché optimiza el orden de escritura. Las escrituras en memoria a menudo se pueden reordenar para reducir la redundancia o para hacer un mejor uso de los ciclos de acceso a la memoria sin cambiar el estado final de lo que se almacenó; mientras que las mismas optimizaciones podrían cambiar por completo el significado y el efecto de las escrituras en las regiones de E/S mapeadas en memoria.
La falta de previsión en la elección de las regiones de E/S mapeadas en memoria provocó muchas de las limitaciones de capacidad de RAM en las generaciones anteriores de ordenadores. Los diseñadores rara vez esperaban que las máquinas crecieran hasta aprovechar al máximo la capacidad teórica de RAM de una arquitectura, por lo que a menudo utilizaban algunos de los bits de orden superior del espacio de direcciones como selectores para las funciones de E/S mapeadas en memoria. Por ejemplo, la limitación de 640 KB en el IBM PC y sus derivados se debe a la reserva de la región entre 640 y 1024 KB (segmentos 10 a 16 de 64k) para el Área de Memoria Superior . Esta elección tuvo inicialmente poco impacto, pero acabó limitando la cantidad total de RAM disponible dentro del espacio de direcciones de 20 bits. La limitación de 3 GB y el hueco PCI son manifestaciones similares de esto con espacios de direcciones de 32 bits, exacerbadas por detalles del proceso de arranque x86 y el diseño de la MMU . Las arquitecturas de 64 bits suelen tener problemas técnicos similares, pero estos rara vez tienen consecuencias prácticas.
Ejemplos
Un sistema sencillo basado en un microprocesador de 8 bits podría proporcionar líneas de dirección de 16 bits, lo que le permitiría direccionar hasta 64 kibibytes (KiB) de memoria. En dicho sistema, los primeros 32 KiB del espacio de direcciones podrían asignarse a la memoria de acceso aleatorio (RAM), otros 16 KiB a la memoria de solo lectura (ROM) y el resto a diversos dispositivos, como temporizadores, contadores, chips de visualización de vídeo, dispositivos de generación de sonido, etc.
El hardware del sistema está configurado de tal manera que los dispositivos en el bus de direcciones solo responden a las direcciones específicas que les corresponden, ignorando todas las demás. Esta es la función del circuito de decodificación de direcciones , que establece el mapa de memoria del sistema. Como resultado, el mapa de memoria del sistema puede tener el aspecto de la tabla de la derecha. Este mapa de memoria contiene huecos, algo bastante común en las arquitecturas de sistemas reales.
Suponiendo que el cuarto registro del controlador de vídeo establece el color de fondo de la pantalla, la CPU puede configurar este color escribiendo un valor en la ubicación de memoria A003 mediante su instrucción estándar de escritura en memoria. Utilizando el mismo método, se pueden mostrar gráficos en una pantalla escribiendo valores de caracteres en un área especial de la RAM dentro del controlador de vídeo. Antes de la llegada de la RAM económica que permitió las pantallas de mapa de bits , este método de celda de caracteres era una técnica popular para las pantallas de vídeo de los ordenadores (véase Interfaz de usuario de texto ).
Tipos básicos de decodificación de direcciones
Los tipos de decodificación de direcciones, en los que un dispositivo puede decodificar direcciones de forma completa o incompleta, incluyen los siguientes:
- Decodificación completa (exhaustiva)
- Mapeo 1:1 de direcciones únicas a un registro de hardware (ubicación de memoria física). Implica verificar cada línea del bus de direcciones .
- Decodificación incompleta (parcial)
- Mapeo n :1 de n direcciones únicas a un registro de hardware. La decodificación parcial permite que una ubicación de memoria tenga más de una dirección, lo que permite al programador referenciarla mediante n direcciones diferentes. También puede utilizarse para simplificar el hardware de decodificación mediante una lógica más sencilla y, a menudo, más económica, que examina solo algunas líneas de dirección cuando no se necesita todo el espacio de direcciones de la CPU. Generalmente, la decodificación es programable, de modo que el sistema puede reconfigurar su propio mapa de memoria según sea necesario, aunque este es un desarrollo más reciente y suele entrar en conflicto con el objetivo de reducir costes.
- Sinónimos: foldback, multiple mapped, partial mapped, address aliasing . [ 9 ] [ 10 ]
- Decodificación lineal
- Las líneas de dirección se utilizan directamente sin lógica de decodificación. Esto se logra con dispositivos como las memorias RAM y ROM, que cuentan con una secuencia de entradas de dirección, y con chips periféricos que tienen una secuencia similar para direccionar un banco de registros. El direccionamiento lineal rara vez se usa solo (solo cuando hay pocos dispositivos en el bus, ya que usar direccionamiento lineal puro para más de un dispositivo suele desperdiciar mucho espacio de direcciones), sino que se combina con alguno de los otros métodos para seleccionar un dispositivo o grupo de dispositivos dentro de los cuales el direccionamiento lineal selecciona un único registro o ubicación de memoria.
Puerto E/S a través de controladores de dispositivos
En los ordenadores con sistema operativo Windows, también se puede acceder a la memoria mediante controladores específicos como DOLLx8KD, que proporciona acceso de E/S en arquitecturas de 8, 16 y 32 bits en la mayoría de las plataformas Windows, desde Windows 95 hasta Windows 7. La instalación de los controladores de puerto de E/S garantiza el acceso a la memoria al activarlos mediante sencillas llamadas a DLL que permiten la E/S del puerto. Cuando no se necesiten, el controlador se puede desactivar para evitar el acceso no autorizado a los puertos de E/S.
Linux proporciona la utilidad pcimem para permitir la lectura y escritura en direcciones MMIO. El kernel de Linux también permite rastrear el acceso MMIO desde módulos del kernel (controladores) mediante la herramienta de depuración mmiotrace . Para habilitar esta función, el kernel de Linux debe compilarse con la opción correspondiente activada. mmiotrace se utiliza para depurar controladores de dispositivos de código cerrado.
Véase también
- Entrada-salida programada
- mmap , que no debe confundirse con E/S mapeada en memoria
- Archivo mapeado en memoria
- Entrada/salida de propósito general
- Primeros ejemplos de computadoras con E/S mapeada a puertos
- PDP-11 , un ejemplo temprano de una arquitectura de computadora que utiliza E/S mapeada en memoria.
- Unibus , un bus de memoria y E/S utilizado por el PDP-11.
- Cambio de banco
- Lista de interrupciones de Ralf Brown
- Coprocesador
- Acceso directo a la memoria
- Interfaz avanzada de configuración y alimentación (ACPI)
- Vulnerabilidades de ejecución especulativa de la CPU
Notas
- ↑ Memoria que, además de los registros, es directamente accesible por el procesador, por ejemplo, DRAM enordenadores compatibles con IBM PC o Flash/SRAM en microcontroladores.
- ↑ Consulte las hojas de datos de Intel sobre familias de CPU específicas, por ejemplo, "Familias de procesadores Intel de décima generación" de 2014 (PDF) . Intel . Abril de 2020. Consultado el 5 de junio de 2023 .;
Referencias
- ↑ Hayes, John P. (1978). Arquitectura y organización de computadoras . McGraw-Hill International Book Company . pág. 419. ISBN 0-07-027363-4.
- ↑ Dandamudi, Sivarama P. (31 de mayo de 2006). «Capítulo 19 Organización de entrada/salida» (PDF) . Fundamentos de organización y diseño de computadoras . Springer Science+Business Media . ISBN 978-0-387-21566-2.
- ↑ "Extensiones de Bochs VBE - Wiki de OSDev" .
- ↑ "Manual del desarrollador de software para arquitecturas Intel 64 e IA-32: Volumen 2A: Referencia del conjunto de instrucciones, AM" (PDF) . Manual del desarrollador de software para arquitecturas Intel 64 e IA-32 . Intel Corporation. Junio de 2010. págs. 3–520 . Consultado el 21 de agosto de 2010 .
- ↑ "Manual del desarrollador de software para arquitecturas Intel 64 e IA-32: Volumen 2B: Referencia del conjunto de instrucciones, NZ" (PDF) . Manual del desarrollador de software para arquitecturas Intel 64 e IA-32 . Intel Corporation . Junio de 2010. págs. 4–22 . Consultado el 21 de agosto de 2010 .
- ↑ "Manual del programador de la arquitectura AMD64: Volumen 3: Instrucciones de propósito general y del sistema" (PDF) . Manual del programador de la arquitectura AMD64 . Advanced Micro Devices . Noviembre de 2009. págs. 117, 181. Consultado el 21 de agosto de 2010 .
- ↑ "¿Qué es la interfaz de medios directos (DMI) de los procesadores Intel?" . Intel . Consultado el 5 de junio de 2023 .
- ↑ Guía del programador de la serie ARM Cortex-A. Número de referencia ARM DEN0013D . págs. 10–13 .
- ↑ "Decodificación parcial de direcciones y espacio de E/S en sistemas operativos Windows" . Microsoft . 4 de diciembre de 2001.
- ↑ "Alias de dirección" . Hewlett-Packard .
- Entrada/salida