개요
IOMMU (Input/Output Memory Management Unit, 입출력 메모리 관리 장치, IOMMU)는 DMA 가능한 입출력 버스와 주기억장치를 접속하는 메모리 관리 장치(MMU)이다. MMU가 CPU에 보이는 가상 주소를 물리 주소로 변환하듯이, IOMMU는 주변기기에서 보이는 가상 주소(장치 주소 또는 입출력 주소라고 부름)을 물리 주소로 변환한다. 주변기기의 오동작에서 메모리를 지키기 위해 메모리 보호 기능도 제공한다.
이는 기존의 DMA방식에서 주변장치가 호스트의 모든 메모리에 접근할 수 있다는 점에서 비롯된다. 하나의 주변장치가 의도되었든 의도되지 않았든 전체 메로리에 대한 접근과 수정권한이 주어지기 때문에 메모리를 보호하기 위한 운영체제와 시스템의 모든 보호 장치를 회피할 수 있기 때문이다. 또한 IOMMU의 도입으로 이러한 Attack방지와 함께, 다른 여러 이점도 주어지게 되었다.
AMD에서는 IOMMU를 AMD-VD라고 부르며, 인텔은 Vt-d라고 공표하고 있다. PCI-SIG에서는 이러한 부분을 I/O가상화, IOV라고 부르고 있으며 다른 이름으로는 Address Translation Services (ATS)라고도 부른다.
이점
물리 주소를 직접 사용할 때와 비교한 IOMMU의 이점은 아래와 같다.
- 큰 버퍼를 확보할 때에 물리적으로 연속이란 것을(실제로 나뉘었지만) 보증할 필요가 없다. IOMMU가 이어져 있게끔 가상 주소와 나뉜 물리 주소의 매핑을 실행한다.
- 주기억 메모리 전체에 지정할 수 있을 만큼의 주소 폭을 가지지 않는 주변기기(버스)일 때에는 IOMMU를 사용하면 메모리 위에 어디든 버퍼가 있어도 액세스가 가능하게 된다. 이것에 의해 주변기기가 액세스 가능한 범위에 있는 버퍼와 실제 버퍼 간에 메모리 복사를 할 필요가 없어진다.
- 메모리 보호 기능에 의해 명시적으로 액세스 권한이 없다면 장치에서 메모리에 액세스할 수 없다. 이것에 의해 장치의 오동작이나 악성 장치로부터 메모리를 보호한다. IOMMU의 설정은 CPU 상에서 동작하는 OS가 실행하기에 장치에서 설정할 수는 없다.
IOMMU는 CPU가 장치와 (DMA가 아닌) 보드 맵 입출력으로 통신할 때에는 사용되지 않는다.