Na computação, uma unidade de gerenciamento de memória de entrada e saída (IOMMU) é uma unidade de gerenciamento de memória (MMU) que conecta um barramento de E/S com capacidade de acesso direto à memória (DMA) à memória principal. Assim como uma MMU tradicional, que traduz endereços virtuais visíveis à CPU em endereços físicos, a IOMMU mapeia endereços virtuais visíveis ao dispositivo (também chamados de endereços de dispositivo ou endereços de E/S mapeados em memória neste contexto) para endereços físicos. Algumas unidades também oferecem proteção de memória contra dispositivos defeituosos ou maliciosos. Um exemplo de IOMMU é a tabela de remapeamento de endereços gráficos (GART), utilizada por placas de vídeo AGP e PCI Express em computadores com arquitetura Intel e AMD. Na arquitetura x86, antes da divisão da funcionalidade da ponte norte e da ponte sul entre a CPU e o Hub Controlador da Plataforma (PCH), a virtualização de E/S não era realizada pela CPU, mas sim pelo chipset .
Vantagens As vantagens de se ter uma IOMMU, em comparação com o endereçamento físico direto da memória (DMA), incluem:
Grandes regiões de memória podem ser alocadas sem a necessidade de serem contíguas na memória física – a IOMMU mapeia endereços virtuais contíguos para os endereços físicos fragmentados subjacentes. Assim, o uso de E/S vetorial (listas de scatter-gather) às vezes pode ser evitado. Dispositivos que não suportam endereços de memória longos o suficiente para acessar toda a memória física ainda podem acessá-la através da IOMMU, evitando sobrecargas associadas à cópia de buffers de e para o espaço de memória endereçável do periférico. Por exemplo, computadores x86 podem endereçar mais de 4 gigabytes de memória com o recurso de Extensão de Endereço Físico (PAE) em um processador x86. No entanto, um dispositivo PCI comum de 32 bits simplesmente não consegue endereçar a memória acima do limite de 4 GiB e, portanto, não pode acessá-la diretamente. Sem uma IOMMU, o sistema operacional teria que implementar bounce buffers (também conhecidos como buffers duplos), que consomem muito tempo. A memória é protegida contra dispositivos maliciosos que tentam ataques de DMA e dispositivos defeituosos que tentam transferências de memória errôneas, porque um dispositivo não pode ler ou gravar em uma memória que não tenha sido explicitamente alocada (mapeada) para ele. A proteção de memória baseia-se no fato de que o SO em execução na CPU controla exclusivamente tanto a MMU quanto a IOMMU. Os dispositivos são fisicamente incapazes de contornar ou corromper as tabelas de gerenciamento de memória configuradas. Na virtualização, os sistemas operacionais convidados podem usar hardware que não foi feito especificamente para virtualização. Hardwares de alto desempenho, como placas de vídeo, usam DMA para acessar a memória diretamente; em um ambiente virtual, todos os endereços de memória são remapeados pelo software da máquina virtual, o que faz com que os dispositivos DMA falhem. A IOMMU lida com esse remapeamento, permitindo que os drivers nativos do dispositivo sejam usados em um sistema operacional convidado. Em algumas arquiteturas, a IOMMU também realiza o remapeamento de interrupções de hardware, de maneira semelhante ao remapeamento de endereços de memória padrão. A paginação de memória periférica pode ser suportada por uma IOMMU. Um periférico que utiliza a extensão PCI-SIG PCIe Address Translation Services (ATS) Page Request Interface (PRI) pode detectar e sinalizar a necessidade de serviços do gerenciador de memória. Para arquiteturas de sistema nas quais a E/S de porta (port I/O) é um espaço de endereço distinto do espaço de endereço de memória, uma IOMMU não é utilizada quando a CPU se comunica com os dispositivos através dessas portas. Já em arquiteturas de sistema nas quais a E/S de porta e a memória são mapeadas em um espaço de endereço comum, uma IOMMU pode traduzir os acessos de E/S de porta.
Desvantagens As desvantagens de ter uma IOMMU, em comparação com o endereçamento físico direto da memória, incluem:
Ocorre alguma degradação de desempenho devido à sobrecarga de tradução e gerenciamento (ex: buscas nas tabelas de páginas ou page table walks). Consumo de memória física para as tabelas de páginas (tradução) de E/S adicionais. Isso pode ser mitigado se as tabelas puderem ser compartilhadas com o processador. Para diminuir o tamanho da tabela de páginas, a granularidade de muitas IOMMUs é igual à paginação de memória (geralmente 4096 bytes); portanto, cada pequeno buffer que precise de proteção contra ataques de DMA deve ser alinhado à página e zerado antes de se tornar visível ao dispositivo. Devido à complexidade de alocação de memória do SO, isso significa que o driver do dispositivo precisa usar bounce buffers para as estruturas de dados sensíveis, diminuindo, assim, o desempenho geral.
Virtualização Quando um sistema operacional está em execução dentro de uma máquina virtual, incluindo sistemas que utilizam paravirtualização, como Xen e KVM, ele geralmente não conhece os endereços físicos do host da memória que acessa. Isso dificulta o fornecimento de acesso direto ao hardware do computador, pois se o SO convidado tentasse instruir o hardware a realizar um acesso direto à memória (DMA) usando endereços físicos do convidado, provavelmente corromperia a memória, já que o hardware desconhece o mapeamento entre os endereços físicos do convidado e do host para a máquina virtual em questão. A corrupção pode ser evitada se o hipervisor ou o SO host intervir na operação de E/S para aplicar as traduções. No entanto, essa abordagem acarreta um atraso na operação de E/S. Uma IOMMU resolve esse problema remapeando os endereços acessados pelo hardware de acordo com a mesma tabela de tradução (ou uma compatível) que é usada para mapear os endereços físicos do convidado para os endereços físicos do host.
Especificações publicadas A AMD publicou uma especificação para a tecnologia IOMMU, chamada AMD-Vi . A IBM ofereceu o modo Extended Control Program Support: Virtual Storage Extended (ECPS:VSE) em sua linha 43xx ; os programas de canal usavam endereços virtuais. A Intel publicou uma especificação para a tecnologia IOMMU como Tecnologia de Virtualização para E/S Direcionada, abreviada como VT-d . Informações sobre o Sun IOMMU foram publicadas na seção Device Virtual Memory Access (DVMA) do Solaris Developer Connection. A Entrada de Controle de Tradução (TCE) da IBM foi descrita em um documento intitulado Segurança de Partição Lógica no IBM eServer pSeries 690. O PCI-SIG tem trabalhos relevantes sob os termos Virtualização de E/S de Raiz Única (SR-IOV) e Serviços de Tradução de Endereços (ATS). Estes eram anteriormente cobertos em especificações distintas, mas a partir do PCI Express 5.0 foram movidos para a Especificação Base do PCI Express. A ARM define sua versão de IOMMU como Unidade de Gerenciamento de Memória do Sistema (SMMU) para complementar sua arquitetura de virtualização.
Veja também Arquitetura de Sistema Heterogêneo (HSA) Lista de hardware compatível com IOMMU E/S mapeada em memória Proteção de memória
Referências
Ligações externas Bottomley, James (1 de maio de 2004). «Using DMA». Specialized System Consultants. Linux Journal (121). Consultado em 9 de agosto de 2006. Arquivado do original em 15 de julho de 2006 Mastering the DMA and IOMMU APIs, Embedded Linux Conference 2014, San Jose, by Laurent Pinchart