
사용자 공간에서 정의된 '가상' PCIe 카드 셤(shim)을 지원하여 호스트 내 PCIe 카드 드라이버 개발을 가능하게 하는 Linux 프레임워크입니다.
PCIem은 몇 가지 새로운 기술을 활용하여 합성 카드를 호스트 OS에 합법적인 PCI 디바이스로 노출시킴으로써 Linux 커널에 가상 PCIe 디바이스를 생성하는 프레임워크입니다.
간단히 말하면, PCIem은 호스트의 실제 하드웨어 없이도 PCIe 디바이스 드라이버를 개발하고 테스트하기 위한(이에 국한되지 않는) 프레임워크입니다.
PCIem과 libfvio-user는 서로 다른 요구에 대응하는 서로 다른 솔루션입니다. 둘을 비교할 때 혼동이 있을 수 있으므로, 차이점을 여기에 정리합니다(그림 1 참조).
가장 큰 차이는 libvfio-user가 에뮬레이션된 PCIe 디바이스를 게스트에 노출하기 위해 일반적으로 클라이언트(vfio-user 프로토콜을 구현하며, 보통 KVM을 통한 VM exit를 사용하는 QEMU)에 의존한다는 것입니다. 여러분은 (일반적으로 콜백 메커니즘을 사용하는) vfio 서버를 작성하며, 이 서버가 이후 클라이언트와 상호작용합니다.
반면 PCIem이 하는 일은 디바이스를 호스트에 직접 노출하는 것입니다. KVM도, 게스트도, 가상 머신도 그 무엇도 필요 없습니다. 디바이스는 물리적으로 연결된 것처럼 호스트의 PCIe 버스에 나타납니다.
graph LR
subgraph Kernel ["Host Linux Kernel"]
direction TB
RealDriver["Real PCIe Driver"]
subgraph Framework ["PCIem Framework"]
direction TB
Config["PCI Config Space"]
BARs["BARs"]
IRQ["Interrupts"]
DMA["DMA / IOMMU"]
end
end
Interface(("/dev/pciem"))
subgraph User ["Linux Userspace"]
direction TB
Shim["Device Emulation"]
end
Framework <==> Interface
Interface <==> Shim
6.6gcc-12amd64/i386, aarch64, riscvaarch64 참고: Raspberry Pi 4b, 디바이스 트리(ACPI 없음)로 테스트됨
riscv 참고: VisionFive 2(디바이스 트리) 및 Muse Pi Pro(디바이스 트리 및 ACPI)로 테스트됨
Weston과 같은 사용자 공간 유틸리티로 구동할 수 있는 Bochs BGA 호환(bochs-drm) 카드입니다. SDL3를 사용합니다.
https://github.com/user-attachments/assets/d2f7abe4-aef4-4d3a-a30b-ab7ec793faed
1GB의 저장 공간이 연결된 NVME 컨트롤러입니다. 사용자는 메모리에서 파일을 자유롭게 포맷, 마운트, 생성 및 삭제할 수 있습니다.
https://github.com/user-attachments/assets/29ce370a-7317-4fd4-9d1d-c3e868e1083d
pipewire와 함께 샘플을 재생할 수 있는 ICH6 호환 에뮬레이션 모델입니다.
참고: 약간의 오디오 잡음은 녹음 시에만 들리며, 그 외에는 정상 작동합니다
https://github.com/user-attachments/assets/7264a18c-6fcb-46c4-acde-9531b0be7ff6
E1000 카드의 다소 단순한 구현입니다. 실제 NIC와의 통신 리다이렉션을 지원합니다. Wi-Fi도 사용할 수 있지만 안정성은 떨어집니다.
https://github.com/user-attachments/assets/b6b9862c-349c-49da-8a79-4769dfa31915
이 카드는 전적으로 QEMU에서 프로그래밍됩니다(기본적으로 카드의 상태 머신). 호스트에서 실행 중인 실제 드라이버의 모든 사용자 공간 초기화 및 명령 처리를 담당합니다.
소프트웨어 렌더링 DOOM(완성된 프레임을 DMA로 카드에 제출하면 QEMU가 표시함)과 간단한 OpenGL 1.X 게임(스크린샷에서는 tyr-glquake 및 xash3d)을 실행할 수 있습니다. 이는 QEMU에 완전히 구현된 커스텀 OpenGL 상태 머신 덕분으로, 명령 목록을 소프트웨어 렌더링하고 내부 상태를 그에 맞게 업데이트합니다.
| 기능 | PCIem | libfvio-user |
|---|
| 연결 방식 | 디바이스 파일 (/dev/pciem) | UNIX 소켓 (vfio-user 프로토콜) |
| 대상 드라이버 실행 위치 | 호스트 | 게스트 OS |
| 에뮬레이션 디바이스 실행 위치 | 사용자 공간 | 사용자 공간 |
| 디바이스 접근 | 직접 (호스트 내) | 가상화 (게스트 → 호스트) |
그림 1: 프레임워크 간 비교
| 배포판 |
|---|
| Ubuntu Latest | - | - | |
| Ubuntu 24.04 LTS | |||
| Debian Stable | - | - | |
| Fedora Latest | - | - | |
| openSUSE Tumbleweed | - | - |