
ユーザー空間で定義された「仮想」PCIeカードシムを可能にし、ホスト内のPCIeカードドライバ開発を可能にするLinuxフレームワーク。
PCIemは、いくつかの新しい技術を活用して合成カードを正当なPCIデバイスとしてホストOSに認識させる、Linuxカーネル内で仮想PCIeデバイスを作成するフレームワークです。
簡単に言えば、PCIemは、(必ずしも限定されませんが)実際のハードウェアをホストに必要とせずにPCIeデバイスドライバを開発・テストするためのフレームワークです。
PCIem と libfvio-user は、それぞれ異なるニーズに応える異なるソリューションです。両者を比較する際に混乱が生じる可能性があるため、ここでその違いを説明します(詳細は図1を参照)。
主な違いは、libvfio-user は通常、エミュレートされたPCIeデバイスをゲストに公開するために、クライアント(vfio-user プロトコルを実装する)、通常はQEMU(KVM、VM exitを経由)に依存していることです。あなたは 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、riscvaarch64注記: 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
1GBのストレージを備えたNVMEコントローラ。ユーザーはメモリ上のファイルを自由にフォーマット、マウント、作成、削除できます。
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カードの非常にシンプルな実装。実際のNICとの通信のリダイレクトをサポート。Wi-Fiも使用可能ですが、安定性は劣ります。
https://github.com/user-attachments/assets/b6b9862c-349c-49da-8a79-4769dfa31915
このカードは完全にQEMU内でプログラムされており(基本的にカードのステートマシン)、QEMUがユーザースペースの初期化と、ホストで実行されている実際のドライバからのコマンド処理をすべて行います。
ソフトウェアレンダリングされたDOOM(DMAで完成したフレームをカードに送信し、QEMUが表示)や、簡単なOpenGL 1.Xゲーム(スクリーンショットではtyr-glquakeとxash3d。QEMUに完全に実装されたカスタムOpenGLステートマシンにより、コマンドリストをソフトウェアレンダリングし、内部状態を適宜更新)を実行できます。
| 機能 | PCIem | libfvio-user |
|---|
| 接続 | デバイスファイル (/dev/pciem) | UNIX ソケット (vfio-user プロトコル) |
| ターゲットドライバの実行場所 | ホスト | ゲストOS |
| エミュレートされたデバイスの実行場所 | ユーザースペース | ユーザースペース |
| デバイスアクセス | 直接(ホスト内) | 仮想化(ゲストからホストへ) |
図1: フレームワークの比較
| ディストリビューション |
|---|
| Ubuntu 最新版 | - | - | |
| Ubuntu 24.04 LTS | |||
| Debian 安定版 | - | - | |
| Fedora 最新版 | - | - | |
| openSUSE Tumbleweed | - | - |