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

33 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 게스트가 하드웨어에 닿는 갈래는 셋이고 깊이가 다르다
## 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.