정의


IOMMU(Input/Output Memory Management Unit, 입출력 메모리 관리 장치)는 DMA(Direct Memory Access, 특정 하드웨어 하위 시스템이 CPU와 독립적으로 메인 시스템 메모리에 접근할 수 있게 해주는 컴퓨터 시스템의 기능이다.) 가능한 버스와 주기억장치를 연결하는 메모리 관리 장치이다.

MMU와 IOMMU


아래 그림은 IOMMU의 기능을 MMU(Memory Management Unit)의 기능과 비교하여 설명한 것으로, 사실 상 IOMMU의 기능을 완벽히 잘 설명한 그림이다.

MMU는 CPU가 메모리에 접근하는 것을 관리하는 컴퓨터 하드웨어 부품이다. Virtual Memory Address를 Physical Memory Address로 변환하며, 메모리 보호, 캐시 관리, 버스 중재 등의 역할을 담당한다.

위 그림은 CPU와 MMU의 작동 방식을 보여주는 그림이다. CPU는 데이터가 필요할 시, 메모리 장치에 데이터를 요청한다.

문제는 CPU가 가지고 잇는 데이터의 주소는 virtual address상의 주소이다. 이를 실제 메모리 장치상의 physical address로의 변환이 필요한데, 이를 MMU가 처리한다.

MMU는 OS가 관리하는 Page table이라는 자료구조를 통해 Virtual-to-Physical 주소 변환을 하는데 Page table은 메모리 장치에 저장되기에 변환 속도가 다소 느리다. 이를 해결하기 위해 MMU는 TLB(Translation lookasibe buffer)라는 빠른 보조기억장치를 가지고 있으며, 이를 cache로 사용하며 반복 참조된 주소에 한해 빠른 주소 변환을 지원한다. 그림에서 보다시피, 현대 CPU상에는 CPU 칩 안에 MMU가 위치해 있다.

MMU가 필요한 이유를 예를 들어 설명하자면 다음과 같다. Multiple process 실행을 위해 CPU는 virtual address상에서 명령어를 실행한다. 예를 들어 program A, program B가 동시에 실행되는 경우, A와 B 모두 메모리상 주소 0x100000에 데이터를 동시에 쓰는 경우가 발생할 수 있다. 다행히 MMU 및 virtual memory 기술을 통해 A와 B가 동시에 가리키는 0x000001 주소는 실제 메모리 상의 다른 주소로 remapping(대체)된다. 그렇기 때문에 program A, B 모두 같은 메모리 주소를 사용하더라도 실제 메모리 장치의 같은 주소에 접근하는 불상사가 발생하지 않는다.

IOMMU 기능과 PCI Virtualization


IOMMU는 DMA 가능한 입출력 버스와 주기억장치를 연결하는 메모리 관리 장치(MMU)이다.

MMU가 CPU에 보이는 가상 주소를 물리 주소로 변환하듯이, IOMMU는 주변기기에서 보이는 가상 주소(장치 주소, 입출력 주소)을 물리 주소로 변환한다. 차이점은 장치의 input인데, MMU의 경우에는 CPU가 보내는 virtual address가 input이였다면, IOMMU는 PCI 디바이스(정확히는 Direct Memory Access 입출력이 가능한 모든 장치)가 보내는 virtual address라는 점이다.

PCI 장치는 DMA(Direct Memory Access)를 통해 직접 시스템 메모리 장치에 데이터를 쓰거나 읽어올 수 있다. IOMMU 없이 DMA를 실행하려면, PCI장치가 시스템 메모리 장치의 주소 공간(physical address space)의 정보를 알고 있어야 한다. 또한 원하는 만큼의 데이터를 옮기기 위해 그만큼의 연속적인 공간이 비어있어야 한다. 주변기기의 오동작에 의해 다른 프로그램이 사용하고 있는 메모리 영역을 침범할 수도 있다.

IOMMU는 MMU와 같이 작동하며 이러한 문제를 해결한다. PCI 장치는 virtual address 상에서의 메모리 주소 공간을 사용하여 작동하며, 실제 시스템 메모리 장치에 접근할 때는 IOMMU를 통해 physical address로 변환되어 데이터에 접근할 수 있다. 다만 주소 변환을 위해 IO용 page table을 OS가 유지하고 있어야 하는 단점도 있지만, 이를 통해 안전하고 flexible하게 IO 디바이스가 시스템 메모리에 접근할 수 있게 되었다.

나아가 가상머신이 직접 IO 디바이스에 접근할 수 있게 해주었다. 가상화 솔루션 상에 동작하는 가상머신의 경우, 가상머신의 운영 체제는 액세스하고 있는 실제 물리 주소를 알 수 없다. 따라서 IOMMU 없이 PCI 디바이스에 직접 특정 물리 주소에 DMA하도록 지시할 수 없다. 하지만 IOMMU 기술을 통해 가상머신의 OS가 PCI 디바이스에게 가상주소로 DMA를 요청하더라도 IOMMU를 통해 실제 물리 주소로 변환되어 정상 작동하게 된다.

이러한 IOMMU 기술을 이용해 가상머신이 하이퍼바이저의 도움없이도 직접 PCI 디바이스에 접근할 수 있게 된다. 이를 PCI Pass-through라고 한다.

  • Ref.

https://en.wikipedia.org/wiki/Input–output_memory_management_unit

https://ko.wikipedia.org/wiki/%EB%A9%94%EB%AA%A8%EB%A6%AC_%EA%B4%80%EB%A6%AC_%EC%9E%A5%EC%B9%98

https://deeprajbhujel.blogspot.com/2015/11/direct-memory-access-dma.html