Files
document-haness/docs/keycloak-session-store/final/assets/cpu-io-passthrough-paths/cpu-io-passthrough-paths.alt.md
T

2.9 KiB
Raw Blame History

게스트가 하드웨어에 닿는 갈래는 셋이고 깊이가 다르다

Alternative text

게스트·호스트 유저공간·호스트 커널·하드웨어 네 층을 가로지르는 세 갈래 경로도.

Long description

위에서 아래로 읽는다. 맨 위 QEMU 에서 갈래 셋이 갈린다. 왼쪽 CPU 갈래는 KVM_RUN 으로 커널의 KVM 에 들어가고 KVM 이 VM entry 로 물리 CPU 에 올리며 게스트 코드가 VMX non-root 로 거기서 돈다. 물리 CPU 상자에 VM exit 이 함께 적혀 있고 나온 이유는 KVM 상자의 struct kvm_run 으로 유저공간에 돌아간다. 가운데 패스스루 갈래는 QEMU 가 VFIO 로 장치 fd 를 받고 vfio-pci 가 장치를 묶으며 그 장치의 DMA 가 IOMMU 를 지난다. 오른쪽 virtio 갈래는 virtqueue 가 게스트 드라이버에 닿고 같은 virtqueue 를 커널 vhost 와 나누는 길이 따로 있다. 앞의 둘은 이 실험대가 쓰고 패스스루는 쓰지 않는다.

Elements and evidence

  • QEMU (service): KVM 핸들을 열고 VM 과 vCPU 를 만드는 유저공간 프로세스. vcpu ioctl 은 그 vcpu 를 만든 스레드에서 낸다. Evidence: L1102L1108.
  • VFIO (service): IOMMU 보호 아래 장치 접근을 유저공간에 여는 프레임워크. 소유 단위가 IOMMU 그룹이다. Evidence: L1131L1146.
  • 물리 PCI 장치 (service): 호스트 드라이버에서 떼어 vfio-pci 에 묶은 장치. Evidence: L1131L1133, L1144L1146.
  • IOMMU (service): 장치가 아무 메모리나 건드리지 못하게 막는 리매핑 장치. Evidence: L1144L1146.
  • KVM (service): mmap 한 공유 메모리로 나온 이유를 유저공간에 알리는 커널 쪽. Evidence: L1105L1108.
  • 물리 CPU (service): VM entry 때 guest-state 영역에서 상태를 싣고 VM exit 때 그리로 저장하는 프로세서. Evidence: L1111L1113.
  • 게스트 코드 (service): VMX non-root 로 물리 CPU 에서 도는 게스트 명령. Evidence: L1111L1113.
  • 게스트 virtio 드라이버 (service): 게스트가 보는 반가상화 장치의 드라이버. 주고받는 통로가 virtqueue 다. Evidence: L1116L1118.
  • vhost (service): virtqueue 를 QEMU 밖과 나누는 커널 구현. vhost-user 규약이 이것을 제어하는 ioctl 인터페이스를 보완한다. Evidence: L1125L1129.

Relationships

  • 물리 CPU → 게스트 코드: VMX non-root. Evidence: L1111L1112.
  • 물리 PCI 장치 → IOMMU: DMA. Evidence: L1144L1146.
  • KVM → 물리 CPU: VM entry. Evidence: L1111L1112.
  • QEMU → VFIO: 장치 fd. Evidence: L1138L1141.
  • QEMU → KVM: KVM_RUN. Evidence: L1104L1106.
  • QEMU → vhost: 제어 ioctl. Evidence: L1125L1129.
  • QEMU → 게스트 virtio 드라이버: virtqueue. Evidence: L1116L1118, L1128L1128.
  • VFIO → 물리 PCI 장치: vfio-pci 결합. Evidence: L1144L1146.