
Ein Linux-Framework, das benutzerdefinierte "virtuelle" PCIe-Karten-Shims ermöglicht, um die Entwicklung von PCIe-Kartentreibern im Host zu ermöglichen.
PCIem ist ein Framework, das virtuelle PCIe-Geräte im Linux-Kernel erstellt, indem es einige neuartige Techniken nutzt, um synthetische Karten als legitime PCI-Geräte für das Host-Betriebssystem erscheinen zu lassen.
Kurz gesagt: PCIem ist ein Framework für die (wenn auch nicht darauf beschränkte) Entwicklung und das Testen von PCIe-Gerätetreibern, ohne dass tatsächliche Hardware auf dem Host erforderlich ist.
PCIem und libfvio-user sind zwei verschiedene Lösungen für unterschiedliche Anforderungen. Beim Vergleich beider könnte Verwirrung entstehen, daher werden hier die Unterschiede dargelegt (siehe Abbildung 1 für weitere Details).
Der Hauptunterschied besteht darin, dass libvfio-user in der Regel auf einen Client angewiesen ist (der das vfio-user-Protokoll implementiert), normalerweise QEMU (über KVM, mittels VM-Exits), um das emulierte PCIe-Gerät dem Gast zugänglich zu machen. Sie schreiben Ihren vfio-Server (normalerweise mit einem Callback-Mechanismus), der dann mit dem Client interagiert.
Was PCIem stattdessen tut, ist, das Gerät direkt auf dem Host verfügbar zu machen; kein KVM, keine Gäste, keine virtuellen Maschinen, nichts. Das Gerät erscheint auf dem PCIe-Bus des Hosts, als wäre es physisch angeschlossen.
graph LR
subgraph Kernel ["Host Linux Kernel"]
direction TB
RealDriver["Echter PCIe-Treiber"]
subgraph Framework ["PCIem Framework"]
direction TB
Config["PCI-Konfigurationsraum"]
BARs["BARs"]
IRQ["Interrupts"]
DMA["DMA / IOMMU"]
end
end
Interface(("/dev/pciem"))
subgraph User ["Linux Userspace"]
direction TB
Shim["Geräteemulation"]
end
Framework <==> Interface
Interface <==> Shim6.6gcc-12amd64/i386, aarch64, riscvaarch64-Hinweis: Getestet mit Raspberry Pi 4b, Device Tree (kein ACPI)
riscv-Hinweis: Getestet mit VisionFive 2 (Device Tree) und Muse Pi Pro (Device Tree und ACPI)
Eine Bochs-BGA-kompatible (bochs-drm) Karte, die von Userspace-Programmen wie Weston verwendet werden kann; verwendet SDL3.
https://github.com/user-attachments/assets/d2f7abe4-aef4-4d3a-a30b-ab7ec793faed
NVME-Controller mit 1 GB angeschlossenem Speicher. Der Benutzer kann den Speicher frei formatieren, mounten, Dateien erstellen und löschen.
https://github.com/user-attachments/assets/29ce370a-7317-4fd4-9d1d-c3e868e1083d
ICH6-kompatibles Emulationsmodell, das in Verbindung mit Pipewire Samples abspielen kann.
HINWEIS: Leichtes Audioknistern ist nur in der Aufnahme hörbar, funktioniert ansonsten einwandfrei
https://github.com/user-attachments/assets/7264a18c-6fcb-46c4-acde-9531b0be7ff6
Eine recht naive Implementierung der E1000-Karte. Unterstützt die Weiterleitung der Kommunikation zu/von Ihrer echten Netzwerkkarte. Kann auch WLAN nutzen, ist aber weniger stabil.
https://github.com/user-attachments/assets/b6b9862c-349c-49da-8a79-4769dfa31915
Die Karte ist vollständig in QEMU programmiert (im Wesentlichen eine Zustandsmaschine für die Karte), die die gesamte Initialisierung und Befehlsverarbeitung im Userspace vom echten Treiber aus durchführt, der auf dem Host läuft.
Kann softwaregerendertes DOOM ausführen (übermittelt fertige Frames per DMA an die Karte, die QEMU anzeigt) und auch einfache OpenGL 1.X-Spiele (auf den Screenshots: tyr-glquake und xash3d; dank einer benutzerdefinierten OpenGL-Zustandsmaschine, die vollständig in QEMU implementiert ist und die Befehlslisten software-rendert sowie den internen Zustand entsprechend aktualisiert).
| Funktion | PCIem | libfvio-user |
|---|
| Verbindung | Gerätedatei (/dev/pciem) | UNIX-Sockets (vfio-user-Protokoll) |
| Zieltreiber läuft auf | Host | Gast-Betriebssystem |
| Emuliertes Gerät läuft auf | Userspace | Userspace |
| Gerätezugriffe | Direkt (innerhalb des Hosts) | Virtualisiert (Gast zu Host) |
Abbildung 1: Vergleich zwischen Frameworks
| Distribution |
|---|
| Ubuntu Latest | - | - | |
| Ubuntu 24.04 LTS | |||
| Debian Stable | - | - | |
| Fedora Latest | - | - | |
| openSUSE Tumbleweed | - | - |