
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.
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 <==> Shim6.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)
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
Modello di emulazione compatibile con ICH6 in grado di riprodurre campioni audio in combinazione con pipewire.
NOTA: Un leggero crepitio audio è udibile solo nella registrazione, funziona correttamente altrimenti
https://github.com/user-attachments/assets/7264a18c-6fcb-46c4-acde-9531b0be7ff6
Un'implementazione piuttosto naïve della scheda E1000. Supporta il reindirizzamento delle comunicazioni da/verso la tua scheda di rete reale. Può anche utilizzare il Wi-Fi, ma è meno stabile.
https://github.com/user-attachments/assets/b6b9862c-349c-49da-8a79-4769dfa31915
La scheda è programmata interamente in QEMU (in pratica una macchina a stati per la scheda), che esegue tutta l'inizializzazione nello spazio utente e la gestione dei comandi dal driver reale in esecuzione sull'host.
Può eseguire DOOM renderizzato via software (invia i frame completati con DMA alla scheda, che QEMU visualizza) e anche semplici giochi OpenGL 1.X (negli screenshot, tyr-glquake e xash3d; grazie a una macchina a stati OpenGL personalizzata implementata interamente in QEMU che renderizza via software le liste di comandi e aggiorna lo stato interno di conseguenza).
| 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
| Distribuzione |
|---|
| Ubuntu Ultima | - | - | |
| Ubuntu 24.04 LTS | |||
| Debian Stabile | - | - | |
| Fedora Ultima | - | - | |
| openSUSE Tumbleweed | - | - |