
Un framework Linux per abilitare shim di schede PCIe "Virtuali" definiti dallo spazio utente per consentire lo sviluppo di driver di schede PCIe all'interno dell'host.
PCIem è un framework che crea dispositivi PCIe virtuali nel kernel Linux sfruttando alcune tecniche innovative per presentare schede sintetiche come dispositivi PCI legittimi al sistema operativo host.
Per riassumere cosa sia PCIem: un framework per (ma non limitato a) lo sviluppo e il test di driver per dispositivi PCIe senza richiedere hardware reale sull'host.
PCIem e libfvio-user sono due soluzioni diverse per esigenze diverse; potrebbe esserci confusione nel confrontarli, pertanto ecco le differenze (vedi figura 1 per maggiori dettagli).
La principale differenza è che libvfio-user solitamente si basa su un client (che implementa il protocollo vfio-user), di solito QEMU (tramite KVM, usando VM exit) per esporre il dispositivo PCIe emulato al guest. Tu scrivi il tuo server vfio (di solito con un meccanismo di callback) che poi interagisce con il client.
PCIem, invece, espone il dispositivo direttamente sull'host; niente KVM, niente guest, niente macchine virtuali. Il dispositivo appare sul bus PCIe dell'host come se fosse fisicamente collegato.
| Caratteristica | PCIem | libfvio-user |
|---|---|---|
| Connessione | File di dispositivo (/dev/pciem) | Socket UNIX (protocollo vfio-user) |
| Il driver di destinazione esegue su | Host | Sistema operativo guest |
| Il dispositivo emulato esegue su | Spazio utente | Spazio utente |
| Accessi al dispositivo | Diretti (all'interno dell'host) | Virtualizzati (guest verso host) |
Figura 1: Confronto tra framework
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, riscvNota per aarch64: Testato con Raspberry Pi 4b, device-tree (senza ACPI)
Nota per riscv: Testato con VisionFive 2 (Device-tree) e Muse Pi Pro (Device-tree e ACPI)
| Distribuzione | |||
|---|---|---|---|
| Ubuntu Ultima | - | - | |
| Ubuntu 24.04 LTS | |||
| Debian Stabile | - | - | |
| Fedora Ultima | - | - | |
| openSUSE Tumbleweed | - | - |
Una scheda compatibile con Bochs BGA (bochs-drm) che può essere gestita da utilità nello spazio utente come Weston; utilizza SDL3.
https://github.com/user-attachments/assets/d2f7abe4-aef4-4d3a-a30b-ab7ec793faed
Controller NVME con 1 GB di storage collegato. L'utente può liberamente formattare, montare, creare e rimuovere file dalla memoria.
https://github.com/user-attachments/assets/29ce370a-7317-4fd4-9d1d-c3e868e1083d