
Фреймворк для 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 хоста так, как если бы оно было физически подключено.
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)
Карта, совместимая с Bochs BGA (bochs-drm), которая может управляться утилитами пользовательского пространства, такими как Weston; использует SDL3.
https://github.com/user-attachments/assets/d2f7abe4-aef4-4d3a-a30b-ab7ec793faed
Контроллер NVME с подключенным хранилищем на 1 ГБ. Пользователь может свободно форматировать, монтировать, создавать и удалять файлы в памяти.
https://github.com/user-attachments/assets/29ce370a-7317-4fd4-9d1d-c3e868e1083d
Модель эмуляции, совместимая с ICH6, способная воспроизводить сэмплы совместно с pipewire.
ПРИМЕЧАНИЕ: Небольшое потрескивание звука слышно только на записи, в остальном работает нормально
https://github.com/user-attachments/assets/7264a18c-6fcb-46c4-acde-9531b0be7ff6
Довольно простая реализация карты E1000. Поддерживает перенаправление связи на/с вашей реальной сетевой карты. Также может использовать Wi-Fi, но менее стабильно.
https://github.com/user-attachments/assets/b6b9862c-349c-49da-8a79-4769dfa31915
Карта полностью запрограммирована в QEMU (по сути, конечный автомат для карты), который выполняет всю инициализацию в пользовательском пространстве и обработку команд от реального драйвера, работающего на хосте.
Может запускать DOOM с программным рендерингом (отправляет готовые кадры через DMA на карту, которую QEMU отображает), а также простые игры OpenGL 1.X (на скриншотах: tyr-glquake и xash3d; благодаря собственной машине состояний OpenGL, полностью реализованной в QEMU, которая программно рендерит списки команд и соответствующим образом обновляет внутреннее состояние).
| Возможность | PCIem | libfvio-user |
|---|
| Соединение | Файл устройства (/dev/pciem) | UNIX-сокеты (протокол vfio-user) |
| Целевой драйвер выполняется на | Хост | Гостевая ОС |
| Эмулируемое устройство выполняется на | Пользовательское пространство | Пользовательское пространство |
| Доступы к устройству | Прямые (на хосте) | Виртуализированные (гость → хост) |
Рисунок 1: Сравнение фреймворков
| Дистрибутив |
|---|
| Ubuntu Последний | - | - | |
| Ubuntu 24.04 LTS | |||
| Debian Stable | - | - | |
| Fedora Последний | - | - | |
| openSUSE Tumbleweed | - | - |