Una de las piezas más importantes en las CPUs contemporáneas es la IOMMU, la cual es esencial para la comunicación de la CPU con los periféricos del sistema. En este artículo os explicamos qué es y las funciones de esta tan desconocida por el público como imprescindible pieza de hardware que se encuentra en todo tipo de sistemas informáticos, desde el smartphone de tu bolsillo al superordenador más potente
¿Cómo interactúan los periféricos con la CPU? Utilizando la RAM del sistema como punto en común para comunicarse de manera mutua, pero ello implica una serie de mecanismos siendo el más importante el que os vamos a describir a continuación.
¿Dónde se encuentra la IOMMU?
Como se puede ver en el diagrama de arriba, los periféricos se encuentran conectados al Southbridge o Puente Sur, este a su vez está conectado con el Northbridge, el cual es el concentrador con el que principalmente la interfaz de la RAM y la CPU se comunican entre sí. Pues bien, la IOMMU se encuentra en el interior del Southbridge que es donde se concentran todas las interfaces de E/S como USB, PCI Express, SATA, etc.
Todas esas interfaces han de pasar bajo el control de la IOMMU para poder acceder a la RAM del sistema. La IOMMU en este caso actúa como una especie de control fronterizo que vigila que los periféricos no hagan accesos ilegales a la memoria y accedan a la parte de la RAM que tenga asignada cada uno de ellos y a ninguna otra parte.
La IOMMU, por tanto, hace de MMU, pero para los periféricos y componentes del sistema.
¿Para qué sirve la IOMMU?
Los periféricos de E/S no comparten la MMU (unidad de manejo de la memoria) con la CPU y por tanto no ven la memoria de la misma manera que el procesador central del sistema. Este problema hace que los periféricos puedan acceder a través de sus interfaces a partes de la memoria del sistema que son delicadas como las reservadas para funciones del propio sistema operativo, lo cual es un problema en entornos multitarea.
Es ahí donde entra la IOMMU, la cual actúa como una unidad esclava de la MMU a la que está comunicada a través del puente Norte/Northbridge del sistema. Gracias a esta comunicación, los periféricos saben en qué direcciones de la RAM tienen permiso de acceso y en cuáles no.
Por otro lado, la IOMMU asigna de manera automática y dinámica direcciones de memoria para la comunicación con los diferentes periféricos, de esta manera la CPU siempre sabe a qué direcciones de memoria tiene que apuntar para comunicarse con éstos.
En los sistemas antiguos no se disponía de una unidad IOMMU y se otorgaba con ellos un mapa de memoria donde se informaba a los programadores qué direcciones de la RAM estaban pensadas para comunicarse con los dispositivos. Por este motivo, los desarrolladores para cada arquitectura distinta se tenían que aprender el direccionamiento de la memoria de cada uno de ellos y saber a que dirección de memoria tenían que escribir o leer para comunicarse con los periféricos. Algo que se llama E/S a través de memoria y de la que hablaremos más adelante.
Hoy en día ya no es así, y la existencia de la IOMMU facilita que los desarrolladores no tengan que aprenderse las direcciones de memoria para comunicarse y amplía las capacidades de configuración y personalización de nuestros PCs permitiendo configuraciones completamente distintas.
E/S a través de memoria
Hay dos formas en las que un procesador se puede comunicar con los periféricos, la primera de ellas es añadir una serie de pines para E/S en el procesador y que la CPU se comunique con ellos a través de dichos pines. Lo cual hace que los periféricos no solo tengan un direccionamiento distinto al de la memoria RAM, sino también un espacio físico distinto.
La otra opción es hacer que los periféricos y la RAM compartan el mismo direccionamiento de memoria, lo que lleva a que a la hora de escribir a ciertas direcciones de memoria la CPU se comunique con uno de los periféricos o con uno de los componentes. Hay que recordar que el hecho de asignar ciertas direcciones de memoria a para E/S no significa que estas tengan que estar asignadas simplemente como memoria, solo que cuando la CPU llama a una dirección de memoria concreta entonces la MMU en colaboración con la IOMMU se encarga de comunicar el periférico o el componente a la CPU.
Este proceso también permite a componentes que compartan el direccionamiento de memoria con la CPU poder comunicarse también con el resto de periféricos de manera directa e intercambiar datos.
Uso de la IOMMU en sistemas virtualizados
La IOMMU permite el acceso a dispositivos físicos de manera segura en entornos virtualizados a través de lo que llamamos device passthrough. El tándem entre la MMU y la IOMMU permite que los dispositivos conectados al PC hagan acto de aparición para las máquinas virtuales que se ejecutan en el sistema. Aunque para ello algunos de los dispositivos que están conectados al PC también han de tener la capacidad de funcionar en las máquinas virtuales, en especial los que todos los procesan datos como puede ser el caso de las GPUs.
Sin la IOMMU no serían posibles entornos virtualizados que tuviesen acceso de manera correcta al hardware instalado en el sistema, por lo que hoy en día es una pieza indispensable en todas las CPUs que tengan que manejar entornos virtualizados.
¿Afectará el CXL a su futuro?
Una de las cosas que va a permitir el CXL va a ser que por fin tanto dispositivos como componentes van a compartir el mismo direccionamiento de memoria que la CPU sin necesidad que exista una IOMMU por el medio, esto permite cosas como el hecho de añadir memoria RAM a través de los puertos PCI Express y por tanto a través de una interfaz de E/S.
¿Nos afecta esto a nivel de usuario? No más bien no, quizás vamos a poder ver tarjetas PCI Express llenas de módulos de memoria RAM y poco más.