Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

부록 E. IOMMU 그룹 작업

Red Hat Enterprise Linux 7에서 도입된VFIO(Virtual Function I/O)는 사용자 공간 드라이버 프레임워크를 제공하는 Linux 커널 모듈 세트입니다. 이 프레임워크는 IOMMU(Input-output Memory Management Unit) 보호 기능을 사용하여 사용자 공간 드라이버에 대한 보안 장치 액세스를 가능하게 합니다. VFIO는 DPDK(Data Plane Development Kit) 와 더 일반적인 PCI 장치 할당 과 같은 사용자 공간 드라이버를 활성화합니다.
VFIO는 IOMMU 그룹을 사용하여 장치를 분리하고 동일한 호스트 물리적 시스템에서 실행되는 두 장치 간에 의도하지 않은 DMA(Direct Memory Access) 를 방지하여 호스트와 게스트 기능에 영향을 미칠 수 있습니다. IOMMU 그룹은 Red Hat Enterprise Linux 7에서 사용할 수 있으며, 이는 Red Hat Enterprise Linux 6에서 제공되는 레거시 KVM 장치 할당에 비해 상당한 개선 사항입니다. 이 부록은 다음을 강조 표시합니다.
  • IOMMU 그룹의 개요
  • 장치 분리의 중요
  • VFIO 이점

E.1. IOMMU 개요

IOMMU는 장치에 대한 가상 주소 공간을 생성하며, 각 I/O 가상 주소(IOVA)는 실제 시스템 메모리의 다른 주소로 변환될 수 있습니다. 변환이 완료되면 장치는 실제 시스템의 메모리 내의 다른 주소에 연결됩니다. IOMMU가 없으면 모든 장치에는 메모리 주소 변환이 없기 때문에 실제 메모리에 대한 공유 플랫 보기가 있습니다. IOMMU를 사용하면 장치는 장치 할당에 유용한 새 주소 공간으로 IOVA 공간을 받습니다.
다른 IOMMU에는 다양한 수준의 기능이 있습니다. 이전에는 IOMMUs가 제한되어 변환만 제공되었으며 종종 주소 공간의 작은 창 만 제공했습니다. 예를 들어 IOMMU는 낮은 메모리에 있는 IOVA 공간의 작은 창(1GB 이하)만 예약하며, 이는 여러 장치에서 공유되었습니다. 일반 목적 IOMMU로 사용되는 AMD 그래픽 주소 remapping 테이블(GART)은 이 모델의 예입니다. 이러한 클래식 IOMMUs는 대부분 소진 버퍼주소 병합 이라는 두 가지 기능을 제공했습니다.
  • 흐름 버퍼 는 장치의 주소 지정 기능이 플랫폼의 기능보다 작은 경우 필요합니다. 예를 들어, 장치의 주소 공간이 메모리의 4GB(32비트)로 제한되고 드라이버는 4GB 이상의 버퍼에 할당하는 경우 장치는 버퍼에 직접 액세스할 수 없습니다. 이러한 상황은 소진 버퍼를 사용하는 상황이 필요합니다. 더 낮은 메모리에 위치한 버퍼 공간은 장치가 Makefile 작업을 수행할 수 있습니다. 버퍼의 데이터는 작업 완료 시 드라이버의 할당된 버퍼에만 복사됩니다. 즉, 하위 메모리 주소에서 더 높은 메모리 주소로 버퍼가 소진됩니다. IOMMUs는 장치의 주소 공간 내에 IOVA 변환을 제공하여 버퍼링을 피합니다. 그러면 버퍼가 장치의 실제 주소 공간을 초과하여 확장되는 경우에도 장치가 버퍼로 직접 수행할 수 있습니다. 이전에는 이 IOMMU 기능이 IOMMU의 배타적 사용 사례이지만 PCI (PCIe) 채택을 통해 4GB 이상의 주소 지정을 지원할 수 있는 기능이 기존이 아닌 모든 끝점에 필요합니다.
  • 기존 메모리 할당에서는 애플리케이션의 필요에 따라 메모리 블록이 할당되고 해제됩니다. 이 방법을 사용하면 실제 주소 공간 전체에 메모리 부족이 발생합니다. 메모리 간격을 더 효율적으로 사용하거나 메모리 간격을 함께 수집할 경우 기본 용어가 더 적합할 경우 더 좋습니다. IOMMU는 IOVA 공간을 통해 이러한 분산된 메모리 목록을 병합하고, 경우에 따라 spread-gather 목록이라고 합니다. 이를 통해 IOMMU는 연속된 ImageStreamTag 작업을 생성하고 궁극적으로 I/O 성능의 효율성을 높입니다. 가장 간단한 예에서 드라이버는 실제 메모리 공간에 연속되지 않은 두 개의 4KB 버퍼를 할당할 수 있습니다. IOMMU는 이러한 버퍼에 연속된 범위를 할당할 수 있으므로 I/O 장치가 두 개의 별도의 4KBReplicass가 아니라 단일 8KBReplicas를 수행할 수 있습니다.
메모리 병합 및 소환 버퍼링이 호스트에서 고성능 I/O에 중요하지만 가상화 환경에 중요한 IOMMU 기능은 최신 IOMMU의 격리 기능입니다. 기존 PCI PCI가 요청 장치(requester ID)의 ID로 트랜잭션을 태그하지 않기 때문에 PCI-Express 이전의 광범위한 격리를 수행할 수 없었습니다. PCI-X에는 일정 수준의 요청자 ID가 포함되어 있지만 트랜잭션 소유권을 갖는 장치 상호 연결 규칙은 장치 격리에 대한 완전한 지원을 제공하지 않았습니다.
PCIe를 사용하면 각 장치의 트랜잭션에 고유 한 요청자 ID가 태그됩니다( PCI 버스/디바이스 번호, 종종 BDF로 축약됨)는 해당 장치의 고유한 IOVA 테이블을 참조하는 데 사용됩니다. 이제 격리가 가능하므로 IOVA 공간은 연결할 수 없는 메모리 오프로드 및 집적 메모리와 같은 변환 작업에만 사용할 수 없지만 장치로부터 Makefile 액세스를 제한하는 데 사용할 수도 있습니다. 이를 통해 장치를 서로 분리하여 메모리 공간의 중복 할당을 방지할 수 있으며 적절한 게스트 가상 머신 장치 관리에 필요합니다. 게스트 가상 머신에서 이러한 기능을 사용하려면 할당된 장치의 IOVA 공간을 가상 머신에 대한 guest-physical-to-host-physical 메모리 매핑으로 채워야 합니다. 이 작업이 완료되면 장치는 게스트 가상 머신의 주소 공간에서 Makefile 작업을 투명하게 수행합니다.


[1] 이 부록의 원본 내용은 RuntimeClass Williamson, principal Software engineer에서 제공했습니다.