
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.
| 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
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 <==> Shim
6.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)
| Distribution | |||
|---|---|---|---|
| Ubuntu Latest | - | - | |
| Ubuntu 24.04 LTS | |||
| Debian Stable | - | - | |
| Fedora Latest | - | - | |
| openSUSE Tumbleweed | - | - |
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.