概要
PCIem は、Linuxカーネル上でユーザ空間のみで動作する PCIeデバイスエミュレーションフレームワーク。 実ハードウェア不要で PCIeドライバの開発・テスト を実現。 BAR、DMA、割り込み などのPCIe機能を包括的にサポート。 QEMU などのユーザ空間アプリでプロトタイプ作成が可能。 MIT/GPLv2デュアルライセンス で公開。
PCIemとは何か
- PCIem は、Linuxカーネル内で 仮想PCIeデバイス を生成するフレームワーク
- 新規技術 により、合成カードを 正規のPCIデバイス としてホストOSに認識させる
- 実機ハードウェア不要 でPCIeデバイスドライバの 開発・検証 を可能にする仕組み
- PCIemフレームワーク を使い、ユーザ空間からデバイス挙動を自在にエミュレート
アーキテクチャ
- Linuxカーネル と ユーザ空間 の2層構成
- /dev/pciem デバイスファイルを介した PCIem Framework の実装
- PCI Config Space や BARマッピング のエミュレーション
- INT/MSI/MSI-X割り込み の動的トリガー
- DMA (IOMMU対応/非対応)や P2P DMA もサポート
- Userspace PCI shim によるPCIeデバイスロジックの実装
- ユーザ空間アプリが PCIem を通じてデバイス制御を実現
- /dev/pciem デバイスファイルを介した PCIem Framework の実装
- 既存のPCIeドライバ は PCIem の存在を意識せず動作可能
主な機能
- BAR(Base Address Register)管理
- プログラムによるBAR登録・管理機構
- ウォッチポイント
- CPUウォッチポイントによるイベント駆動型アーキテクチャ
- 割り込みサポート
- Legacy IRQ/MSI/MSI-X の全サポートと動的トリガー
- PCI Capabilityフレームワーク
- モジュール式PCI機能システム(内部はリンクリスト構造)
- DMAシステム
- IOMMU対応 DMA操作とアトミックメモリ操作サポート
- P2P DMA
- デバイス間ピアツーピアDMA(ホワイトリストベースのアクセス制御)
- ユーザ空間定義型
- PCIeプロトタイプを 任意のユーザ空間アプリ で実装可能
利用例
- ProtoPCIemカード
- QEMU 上でカード全体をプログラムし、初期化やコマンド処理をユーザ空間で実現
- DOOM などのソフトウェアレンダリングゲームを動作可能
- OpenGL 1.X ゲーム(例:tyr-glquake、xash3d)もQEMU内のカスタムOpenGLステートマシンで描画
- DMA経由でフレームをカードに送信し、QEMUが表示
ライセンス
- pciem_framework.c および protopciem_driver.c は MIT/GPLv2デュアルライセンス
- その他の部分は MITライセンス
参考リンク
- Blog post: https://cakehonolulu.github.io/introducing-pciem/
- Documentation: https://cakehonolulu.github.io/docs/pciem/
- PCI Express specification: https://pcisig.com/specifications