Computing

[가상화] IOMMU와 VT-d (PCI Pass-through) 본문

Cloud/개념

[가상화] IOMMU와 VT-d (PCI Pass-through)

jhson989 2022. 10. 19. 23:02

AMD의 IOMMU, Intel의 VT-d 기술은 가상머신(Virtual machine, VM)에서 Host 상의 PCI 디바이스 (ex, GPU, NIC, etc.)에 직접 접근(pass-through)하기 위해서 필요한 기술이다. IOMMU는 Input/Output Memory Management Unit을, VT-d는 Virtualization Technology for Directed I/O를 의미한다. 둘 다 같은 기능을 수행하는 하드웨어 유닛으로 제품을 만든 회사에 따라 다른 이름으로 불린다.

 

이번 포스터에서는 가상머신이 Host 상의 물리적인 PCIe 디바이스에 직접 접근하는 것이 가능하게 한 기술, IOMMU(VT-d)에 대해서 정리하고자 한다.

 

 

 

MMU와 IOMMU

Fig 1. IOMMU의 기능 [1]

 

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

 

메모리 관리 장치(Memory Management Unit, MMU)는 CPU가 메모리에 접근하는 것을 관리하는 컴퓨터 하드웨어 부품이다. 가상 메모리 주소(Virtual memory address)를 실제 메모리 주소(Physical memory address)로 변환하며, 메모리 보호, 캐시 관리, 버스 중재 등의 역할을 담당한다[2]. 

 

Fig 2. MMU의 작동 [2]

 

Fig 2.는 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가 동시에 가리키는 0x100000 주소는 실제 메모리 상의 다른 주소로 대체(remapping)된다. 그렇기 때문에 program A, B 모두 같은 메모리 주소를 사용하더라도 실제 메모리 장치의 같은 주소에 접근하는 불상사가 발생하지 않는다.

 

 

 

IOMMU 기능과 PCI Virtualization

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

 

Fig 3. DMA 작동 [3]

 

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라고 한다.

 

 

 

Reference

[1] https://ko.wikipedia.org/wiki/IOMMU

[2] 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

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

 

'Cloud > 개념' 카테고리의 다른 글

[가상화] PCI Pass-through와 VFIO  (0) 2022.10.21
libvirt 개념  (0) 2022.08.29
[클라우드] 가상화란? (Virtualization, Hypervisor)  (0) 2022.06.29