# 게스트가 하드웨어에 닿는 갈래는 셋이고 깊이가 다르다 ## 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: L1102–L1108. - **VFIO** (service): IOMMU 보호 아래 장치 접근을 유저공간에 여는 프레임워크. 소유 단위가 IOMMU 그룹이다. Evidence: L1131–L1146. - **물리 PCI 장치** (service): 호스트 드라이버에서 떼어 vfio-pci 에 묶은 장치. Evidence: L1131–L1133, L1144–L1146. - **IOMMU** (service): 장치가 아무 메모리나 건드리지 못하게 막는 리매핑 장치. Evidence: L1144–L1146. - **KVM** (service): mmap 한 공유 메모리로 나온 이유를 유저공간에 알리는 커널 쪽. Evidence: L1105–L1108. - **물리 CPU** (service): VM entry 때 guest-state 영역에서 상태를 싣고 VM exit 때 그리로 저장하는 프로세서. Evidence: L1111–L1113. - **게스트 코드** (service): VMX non-root 로 물리 CPU 에서 도는 게스트 명령. Evidence: L1111–L1113. - **게스트 virtio 드라이버** (service): 게스트가 보는 반가상화 장치의 드라이버. 주고받는 통로가 virtqueue 다. Evidence: L1116–L1118. - **vhost** (service): virtqueue 를 QEMU 밖과 나누는 커널 구현. vhost-user 규약이 이것을 제어하는 ioctl 인터페이스를 보완한다. Evidence: L1125–L1129. ## Relationships - **물리 CPU → 게스트 코드:** VMX non-root. Evidence: L1111–L1112. - **물리 PCI 장치 → IOMMU:** DMA. Evidence: L1144–L1146. - **KVM → 물리 CPU:** VM entry. Evidence: L1111–L1112. - **QEMU → VFIO:** 장치 fd. Evidence: L1138–L1141. - **QEMU → KVM:** KVM_RUN. Evidence: L1104–L1106. - **QEMU → vhost:** 제어 ioctl. Evidence: L1125–L1129. - **QEMU → 게스트 virtio 드라이버:** virtqueue. Evidence: L1116–L1118, L1128–L1128. - **VFIO → 물리 PCI 장치:** vfio-pci 결합. Evidence: L1144–L1146.