
Фреймворк для Linux, позволяющий определять в пользовательском пространстве «виртуальные» прослойки (shims) PCIe-карт для разработки драйверов PCIe на хосте.
PCIem — это фреймворк, создающий виртуальные PCIe-устройства в ядре Linux с использованием нескольких новых методик для представления синтетических карт в качестве легитимных PCI-устройств для хост-ОС.
Если кратко: PCIem — это фреймворк для (хотя и не ограничиваясь) разработки и тестирования драйверов PCIe-устройств без необходимости наличия реального оборудования на хосте.
PCIem и libfvio-user — это два разных решения для разных задач; между ними может возникнуть путаница, поэтому ниже приведены различия (см. рисунок 1 для подробностей).
Основное отличие в том, что libvfio-user обычно полагается на клиент (реализующий протокол vfio-user), обычно QEMU (через KVM, с использованием VM-exit'ов), чтобы предоставить эмулированное PCIe-устройство гостевой системе. Вы пишете свой vfio-сервер (обычно с механизмом обратных вызовов), который взаимодействует с клиентом.
PCIem же делает следующее: выставляет устройство напрямую на хосте; никакого KVM, гостей, виртуальных машин — ничего. Устройство появляется на шине PCIe хоста так, как если бы оно было физически подключено.
| Возможность | PCIem | libfvio-user |
|---|---|---|
| Соединение | Файл устройства (/dev/pciem) | UNIX-сокеты (протокол vfio-user) |
| Целевой драйвер выполняется на | Хост | Гостевая ОС |
| Эмулируемое устройство выполняется на | Пользовательское пространство | Пользовательское пространство |
| Доступы к устройству | Прямые (на хосте) | Виртуализированные (гость → хост) |
Рисунок 1: Сравнение фреймворков
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, riscvПримечание для aarch64: Протестировано на Raspberry Pi 4b, дерево устройств (без ACPI)
Примечание для riscv: Протестировано на VisionFive 2 (дерево устройств) и Muse Pi Pro (дерево устройств и ACPI)
| Дистрибутив | |||
|---|---|---|---|
| Ubuntu Последний | - | - | |
| Ubuntu 24.04 LTS | |||
| Debian Stable | - | - | |
| Fedora Последний | - | - | |
| openSUSE Tumbleweed | - | - |
Карта, совместимая с Bochs BGA (bochs-drm), которая может управляться утилитами пользовательского пространства, такими как Weston; использует SDL3.
https://github.com/user-attachments/assets/d2f7abe4-aef4-4d3a-a30b-ab7ec793faed
Контроллер NVME с подключенным хранилищем на 1 ГБ. Пользователь может свободно форматировать, монтировать, создавать и удалять файлы в памяти.