# Unidad de gestión de memoria de entrada/salida

En informática, una unidad de gestión de memoria de entrada y salida (input–output memory management unit, acrónimo IOMMU) es una unidad de gestión de memoria (MMU) que conecta un bus de E/S con capacidad de acceso directo a memoria (compatible con DMA) a la memoria principal. Al igual que una MMU tradicional, que traduce direcciones virtuales visibles de CPU a direcciones físicas, IOMMU correlaciona direcciones virtuales visibles de dispositivo (también llamadas direcciones de dispositivo o direcciones de E/S en este contexto) a direcciones físicas. Algunas unidades también brindan protección de memoria contra dispositivos defectuosos o maliciosos.
AGP y PCI Express en Intel Architecture y las computadoras AMD.Un ejemplo de IOMMU es la tabla de reasignación de direcciones gráficas (GART) utilizada por las tarjetas gráficas
En la arquitectura x86, antes de dividir la funcionalidad de northbridge y southbridge entre la CPU y Platform Controller Hub (PCH), la virtualización de E/S no fue realizada por la CPU, sino por el conjunto de chips.
La IOMMU permite varias mejoras significativas a nivel de sistema:
* Compatibilidad con dispositivos de E/S heredados de 32 bits en sistemas de 64 bits (generalmente sin necesidad de bufferes de rebote ni costosas copias de memoria).
* Acceso más seguro de las aplicaciones a nivel de usuario a los dispositivos de E/S seleccionados.
* Acceso más seguro del sistema operativo invitado de la máquina virtual a los dispositivos de E/S seleccionados.
Además, la IOMMU puede utilizarse para:
* Reemplazar el mecanismo existente de Tabla de Reasignación de Direcciones Gráficas (GART).
* Reasignar las direcciones por encima de 4GB para los dispositivos de E/S que no soportan el direccionamiento de 64 bits.
* Permitir que un sistema operativo invitado que se ejecute en una máquina virtual tenga un control directo y asignado de un dispositivo.
* Proporcionar un control de granularidad de página del acceso del dispositivo a la memoria del sistema.
* Permitir el acceso directo de un dispositivo a la E/S del espacio de usuario.
* Permitir la entrega directa de interrupciones a un sistema operativo invitado.
* Filtrar y reasignar las interrupciones.
* Compartir el espacio de direcciones virtuales del proceso con dispositivos periféricos seleccionados.
* Aislar los dispositivos para evitar que el DMA malintencionado acceda a datos de usuario y del sistema operativo sensibles a la seguridad en la memoria.
* Aplicar las políticas de seguridad del sistema operativo para el acceso a los datos.

## Ventajas

Las ventajas de tener una IOMMU, en comparación con el direccionamiento físico directo de la memoria (DMA), incluyen:
* Se pueden asignar grandes regiones de memoria sin la necesidad de que sean contiguas en la memoria física: el IOMMU asigna direcciones virtuales contiguas a las direcciones físicas fragmentadas subyacentes. Por lo tanto, a veces se puede evitar el uso de E/S vectorizadas.
* Los dispositivos que no admiten direcciones de memoria lo suficientemente largas como para direccionar toda la memoria física aún pueden direccionar toda la memoria a través de la IOMMU, evitando los gastos indirectos asociados con la copia de almacenamientos intermedios hacia y desde el espacio de memoria direccionable del periférico.
** Por ejemplo, las computadoras x86 pueden administrar más de 4 gigabytes de memoria con la función Extensión de dirección física (PAE) en un procesador x86. Aun así, un dispositivo PCI ordinario de 32 bits simplemente no puede direccionar la memoria por encima del límite 4 GiB, y por lo tanto no puede acceder directamente a él. Sin una IOMMU, el sistema operativo tendría que implementar bounce buffers que consumen tiempo (también conocidos como búfers dobles).
* La memoria está protegida contra los dispositivos maliciosos que intentan ataques DMA y dispositivos defectuosos que intentan transferencias de memoria erróneas porque un dispositivo no puede leer o escribir en la memoria que no se ha asignado (mapeado) explícitamente. La protección de memoria se basa en el hecho de que el SO que se ejecuta en la CPU (ver figura) controla exclusivamente tanto la MMU como la IOMMU. Los dispositivos son físicamente incapaces de eludir o dañar las tablas configuradas de administración de memoria.
** En virtualización, los sistemas operativos invitados pueden usar hardware que no está específicamente diseñado para la virtualización. El hardware de mayor rendimiento, como las tarjetas gráficas, usa DMA para acceder directamente a la memoria; en un entorno virtual, todas las direcciones de memoria son reasignadas por el software de la máquina virtual, lo que hace que los dispositivos DMA fallen. IOMMU maneja esta reasignación, permitiendo que los controladores de dispositivos nativos se usen en un sistema operativo invitado.
* En algunas arquitecturas, IOMMU también realiza reasignaciones de interrupciones de hardware, de forma similar a la reasignación de direcciones de memoria estándar.
* La paginación de la memoria periférica puede ser apoyada por un IOMMU. Un periférico que usa la extensión PCI-SIG PCIe Address Translation Services (ATS) Page Request Interface (PRI) puede detectar y señalar la necesidad de servicios de gestión de memoria.
Para las arquitecturas de sistema en las que los puertos E/S es un espacio de direcciones distinto del espacio de direcciones de memoria, no se utiliza una IOMMU cuando la CPU se comunica con dispositivos a través de puertos E/S. En las arquitecturas de sistema en las que los puertos E/S y la memoria se asignan en un espacio de direcciones adecuado, una IOMMU puede traducir las direcciones de puerto E/S.

## Desventajas

Las desventajas de tener una IOMMU, en comparación con el direccionamiento físico directo de memoria, incluyen:
* Degradación del rendimiento por sobrecarga de traducción y administración (por ejemplo, paseos de tablas de paginación).
* Consumo de memoria física para las tablas página E/S añadidas. Esto puede mitigarse si las tablas se pueden compartir con el procesador.

## Virtualización

Cuando un sistema operativo se ejecuta dentro de una máquina virtual, incluidos los sistemas que utilizan paravirtualización, como Xen, por lo general no conocen las direcciones físico-host de la memoria a las que accede. Esto dificulta el acceso directo al hardware, ya que si el sistema operativo invitado intenta instruir al hardware para que realice un acceso directo a la memoria (DMA) usando direcciones físicas de invitado, es probable que corrompa la memoria, ya que el hardware no lo sabe. la asignación entre las direcciones físico-huésped y física del host para la máquina virtual dada. La corrupción se evita porque el hipervisor o el sistema operativo host interviene en la operación de E/S para aplicar las traducciones, lo que provoca un retraso en la operación de E/S.
Un IOMMU puede resolver este problema reasignando las direcciones a las que accedió el hardware de acuerdo con la misma tabla de traducción (o una compatible) que se utiliza para asignar la dirección física del invitado a las direcciones físicas del host.
Los dispositivos de E/S cuyos accesos a la memoria son traducidos por la IOMMU sólo pueden acceder a las páginas que están expresamente mapeadas por las tablas de páginas de E/S asociadas, según lo concedido por el hipervisor y el sistema operativo. Por lo tanto, el acceso de los dispositivos de E/S puede limitarse sólo a las páginas a las que los procesos de nivel de usuario tienen legítimamente acceso cuando el dispositivo suministra la información. Esto significa que las operaciones de E/S pueden iniciarse sin la intervención del hipervisor o del sistema operativo.
Además de la traducción de direcciones, habilitar el acceso a dispositivos de E/S a nivel de usuario implica otras consideraciones de diseño, como la reasignación de interrupciones. El software del sistema debe evaluar la necesidad de bloquear en memoria todas las páginas a las que podría acceder un dispositivo de E/S controlado por un proceso de nivel de usuario.
Si un periférico tiene soporte para el protocolo PCI Express ATS e implementa un IOTLB, y además implementa soporte para el protocolo opcional de Solicitud de Página de Periféricos (PRI/PPR), entonces el software del sistema (Sistema Operativo o Hipervisor) es capaz de soportar el acceso a la memoria paginable para los dispositivos de E/S controlados por el nivel de usuario.

## Publicaciones específicas

* AMD ha publicado una especificación para la tecnología IOMMU.
* Intel ha publicado una especificación para tecnología IOMMU como Virtualization Technology for Directed I/O (VT-d).
* Se ha publicado información sobre el IOMMU de Sun IOMMU en la sección Acceso a la memoria virtual del dispositivo (DVMA) de Solaris Developer Connection.
* IBM Translation Control Entry (TCE) se ha descrito en un documento titulado Seguridad de partición lógica en IBM eServer pSeries 690.
* El PCI-SIG tiene un trabajo relevante bajo los términos I/O Virtualization (IOV) y Address Translation Services (ATS).
* ARM define su versión de IOMMU como System Memory Management Unit (SMMU) para complementar su arquitectura de virtualización