
Un framework Linux permettant de définir des shims de cartes PCIe "virtuelles" définis par l'espace utilisateur pour faciliter le développement de pilotes de cartes PCIe dans l'hôte.
PCIem est un framework qui crée des périphériques PCIe virtuels dans le noyau Linux en exploitant quelques techniques novatrices pour peupler des cartes synthétiques en tant que périphériques PCI légitimes pour l'OS hôte.
Pour résumer ce qu'est PCIem : un framework pour (bien que non limité à) développer et tester des pilotes de périphériques PCIe sans nécessiter de matériel réel sur l'hôte.
PCIem et libfvio-user sont deux solutions différentes pour des besoins différents, il peut y avoir une confusion lors de la comparaison des deux, voici donc les différences (Voir figure 1 pour plus de détails).
La principale est que libvfio-user repose généralement sur un client (qui implémente le protocole vfio-user), généralement QEMU (via KVM, en utilisant des sorties de VM) pour exposer le périphérique PCIe émulé à l'invité. Vous écrivez votre serveur vfio (avec un mécanisme de rappel généralement) qui interagit ensuite avec le client.
Ce que fait PCIem à la place, c'est exposer le périphérique directement sur l'hôte ; pas de KVM, pas d'invités, pas de machines virtuelles, rien. Le périphérique apparaît sur le bus PCIe de l'hôte comme s'il était physiquement connecté.
| Fonctionnalité | PCIem | libfvio-user |
|---|---|---|
| Connexion | Fichier de périphérique (/dev/pciem) | Sockets UNIX (protocole vfio-user) |
| Pilote cible s'exécute sur | Hôte | OS invité |
| Périphérique émulé s'exécute sur | Espace utilisateur | Espace utilisateur |
| Accès au périphérique | Direct (sur l'hôte) | Virtualisé (invité vers hôte) |
Figure 1 : Comparaison entre les frameworks
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, riscvNote aarch64 : Testé avec Raspberry Pi 4b, device-tree (pas d'ACPI)
Note riscv : Testé avec VisionFive 2 (Device-tree) et Muse Pi Pro (Device-tree et ACPI)
| Distribution | |||
|---|---|---|---|
| Ubuntu Dernière | - | - | |
| Ubuntu 24.04 LTS | |||
| Debian Stable | - | - | |
| Fedora Dernière | - | - | |
| openSUSE Tumbleweed | - | - |
Une carte compatible Bochs BGA (bochs-drm) qui peut être pilotée par des utilitaires espace utilisateur tels que Weston ; utilise SDL3.
https://github.com/user-attachments/assets/d2f7abe4-aef4-4d3a-a30b-ab7ec793faed