# Unità di gestione della memoria di input-output

In informatica, l'unità di gestione della memoria di input-output, nota anche con l'acronimo inglese IOMMU (input-output memory management unit), è un'unità di gestione della memoria (MMU) che collega un bus I/O con capacità di accesso diretto alla memoria (compatibile con DMA) alla memoria principale. Come la MMU tradizionale, che traduce gli indirizzi virtuali, visibili dalla CPU, in indirizzi fisici, la IOMMU mappa gli indirizzi virtuali visibili dal dispositivo (chiamati anche indirizzi del dispositivo o indirizzi I/O) su indirizzi fisici. Alcune unità forniscono anche una protezione della memoria da dispositivi difettosi o dannosi.
Un esempio di IOMMU è la tabella di rimappatura degli indirizzi grafici (GART) utilizzata dalle schede grafiche AGP e PCI Express su computer Intel Architecture e AMD.
Sull'architettura x86, prima di suddividere le funzionalità di northbridge e southbridge tra CPU e Platform Controller Hub (PCH), la virtualizzazione dell'I/O non veniva eseguita dalla CPU ma dal chipset .

## Vantaggi

I vantaggi di avere una IOMMU, rispetto all'indirizzamento fisico diretto della memoria (DMA), includono:
* La possibilità di allocare vaste regioni di memoria senza la necessità che queste siano contigue nella memoria fisica; sarà IOMMU a mappare gli indirizzi virtuali contigui agli indirizzi fisici frammentati.
* I dispositivi che non supportano indirizzi di memoria sufficientemente lunghi per indirizzare l'intera memoria fisica possono comunque indirizzare l'intera memoria tramite IOMMU, evitando i costi generali associati alla copia dei buffer da e verso lo spazio di memoria indirizzabile della periferica.
** Ad esempio, i computer x86 possono indirizzare più di 4 gigabyte di memoria con la funzione Physical Address Extension (PAE) in un processore x86. Tuttavia, un normale dispositivo PCI a 32 bit non può indirizzare la memoria al di sopra del limite di 4 GB e quindi non può accedervi direttamente. Senza la IOMMU, il sistema operativo dovrebbe implementare dei buffer di rimbalzo dispendiosi in termini di tempo (noti anche come double buffer).
* La memoria è protetta da dispositivi dannosi che stanno tentando attacchi DMA e dispositivi difettosi che stanno tentando trasferimenti di memoria errati, poiché un dispositivo non può leggere o scrivere nella memoria che non è stata allocata (mappata) esplicitamente per esso. La protezione della memoria si basa sul fatto che il sistema operativo in esecuzione sulla CPU (vedi figura) controlla esclusivamente sia la MMU che la IOMMU. I dispositivi non sono fisicamente in grado di aggirare o danneggiare le tabelle di gestione della memoria configurate.
** Nella virtualizzazione, i sistemi operativi guest possono utilizzare hardware non specificamente realizzato per la virtualizzazione. L'hardware con prestazioni più elevate, come le schede grafiche, utilizza DMA per accedere direttamente alla memoria; in un ambiente virtuale tutti gli indirizzi di memoria vengono rimappati dal software della macchina virtuale, causando il malfunzionamento dei dispositivi DMA. La IOMMU gestisce questa rimappatura, consentendo l'utilizzo dei driver di dispositivo nativi in un sistema operativo guest.
* In alcune architetture la IOMMU esegue anche la rimappatura degli interrupt hardware, in modo simile alla rimappatura standard degli indirizzi di memoria.
* Il paging della memoria periferica può essere supportato da una IOMMU. Una periferica che utilizza l'estensione PCI-SIG PCIe Address Translation Services (ATS) Page Request Interface (PRI) è in grado di rilevare e segnalare la necessità di servizi di gestione della memoria.
Per le architetture in cui la porta I/O si trova in uno spazio di indirizzi distinto dallo spazio di indirizzi di memoria, la IOMMU non viene utilizzata per le comunicazioni tra CPU e dispositivi tramite le porte di I/O . Nelle architetture di sistema in cui le porte I/O e la memoria sono mappate in uno spazio di indirizzi adeguato, un IOMMU può tradurre gli accessi alle porte I/O.

## Svantaggi

Gli svantaggi di avere una IOMMU, rispetto all'indirizzamento fisico diretto della memoria, includono:
* Degrado delle prestazioni dovuto alle operazioni di traduzione e gestione.
* Consumo di memoria fisica per le tabelle di pagina I/O aggiunte (traduzione). Questo può essere mitigato se le tabelle possono essere condivise con il processore.
* Per ridurre la dimensione della tabella delle pagine, la granularità di molte IOMMU è uguale alla paginazione della memoria (spesso 4096 byte), e quindi ogni piccolo buffer che necessita di protezione contro l'attacco DMA deve essere allineato e azzerato prima di renderlo visibile al dispositivo. A causa della complessità dell'allocazione della memoria del sistema operativo, ciò significa che il driver del dispositivo deve utilizzare buffer di rimbalzo per le strutture di dati sensibili e quindi ridurre le prestazioni complessive.

## Virtualizzazione

Quando un sistema operativo è in esecuzione all'interno di una macchina virtuale, inclusi i sistemi che utilizzano la paravirtualizzazione, come Xen e KVM, di solito non conosce gli indirizzi fisici dell'host di memoria a cui accede. Ciò rende difficile fornire l'accesso diretto all'hardware del computer, poiché se il sistema operativo guest tentasse di eseguire istruzioni dirette sull'hardware utilizzando un accesso diretto alla memoria (DMA) ma con indirizzi fisici guest, probabilmente danneggerebbe la memoria, poiché l'hardware non è a conoscenza della mappatura tra gli indirizzi fisici del guest e quelli fisici dell'host per la macchina virtuale specificata. Il danneggiamento può essere evitato se l'hypervisor o il sistema operativo host intervenisse nell'operazione di I/O per applicare le traduzioni degli indirizzi. Tuttavia, questo approccio comporta un ritardo nell'operazione di I/O.
Una IOMMU risolve questo problema mappando nuovamente gli indirizzi a cui si accede dall'hardware in base alla stessa tabella di traduzione (o compatibile) utilizzata per mappare l'indirizzo fisico del guest agli indirizzi fisici dell'host.

## Specifiche pubblicate

* AMD ha pubblicato una specifica per la tecnologia IOMMU, denominata AMD-Vi .
* IBM ha offerto supporto per il programma di controllo esteso: modalità Virtual Storage Extended (ECPS:VSE) sulla sua linea 43xx ; i programmi di canale utilizzavano indirizzi virtuali.
* Intel ha pubblicato una specifica per la tecnologia IOMMU come Virtualization Technology for Directed I/O, abbreviata VT-d .
* Le informazioni su Sun IOMMU sono state pubblicate nella sezione Device Virtual Memory Access (DVMA) di Solaris Developer Connection.
* L'IBM Translation Control Entry (TCE) è stato descritto in un documento intitolato Logical Partition Security in IBM eServer pSeries 690.
* Il PCI-SIG ha un lavoro rilevante sotto i termini I/O Virtualization (IOV) e Address Translation Services (ATS).
* ARM definisce la sua versione di IOMMU come System Memory Management Unit (SMMU) per completare la sua architettura di virtualizzazione.