インテルのみ表示可能 — GUID: bks1589498743193
Ixiasoft
インテルのみ表示可能 — GUID: bks1589498743193
Ixiasoft
8.1.1. アーキテクチャー
次の図は、MCDMA カスタムドライバーのソフトウェア・アーキテクチャー・ブロック図を示しています。
上記のブロック図で、点線はメモリーマップド I/O インターフェイスを表します。他の 2 行は、デバイスによってトリガーされる読み出し操作と書き込み操作を表します。
- vfio-pci
- UIO
これらのドライバーは、デバイス管理を実行せず、オペレーティング・システム (OS) に対して、デバイスがユーザー空間によって使用されていることを示し、OS がこれらのデバイスに対してアクション (デバイスのスキャンなど) を実行しないようにします。
vfio-pci
これは、カーネル配布によって提供されるセキュア カーネルモジュールです。このモジュールを使用すると、I/O メモリー管理ユニット (IOMMU) をプログラムできます。 IOMMU は、ユーザー空間ドライバーでメモリーの安全性を確保するのに役立つハードウェアです。場合によっては、Single Root I/O Virtualization (SR-IOV) を使用している場合は、vfio-pci をロードしてデバイスをバインドできます。
- このモジュールは、IOMMU プログラミングと機能レベル リセット (FLR) を有効にします。
- デバイスのベース・アドレス・レジスター (BAR) をユーザー空間に公開するために、vfio-pci は ioctl を有効にします。
- MSI-X (Message Signal Interrupts extensions) 割り込みをサポートします。
- カーネルバージョン >= 5.7 では、sysfs インターフェイスを使用した仮想機能の有効化がサポートされています。
- VF の有効化をサポートする ifc_uio を使用します。
- カーネルにパッチを適用して、sysfs を使用して仮想機能を有効にします。カーネルの再構築が必要です。
ifc_uio
これは、IOMMU を使用しない vfio-pci の代替ドライバーです。
PCIe、sysfs、割り込みフレームワーク ユーティリティを使用することにより、このモジュールはユーザー空間がデバイスにアクセスできるように読み出します。
vfio-pci と同様に、このモジュールもゲスト VM からハイパーバイザー経由で使用できます。このドライバーにより、仮想機能の有効化/無効化が可能になります。仮想関数が作成されると、デフォルトで ifc_uio にバインドされます。要件に基づいて、バインドを解除して別のドライバーにバインドすることができます。
- sysfs インターフェイスを使用して、仮想機能の有効化/無効化を許可します。
- チャネル BAR を調査して libmqdma にエクスポートします。
- 割り込み通知/クリアをサポートします。
libmqdma
- このライブラリーには、MCDMA IP デザインにアクセスするための API が含まれており、この API を使用してアプリケーションを開発できます。
- チャネルの割り当て、解放、リセットの呼び出しを特徴としています。
- libmqdma は、UIO または仮想機能 I/O (VFIO ) によってバインドされたデバイスへのアクセスをサポートしています。
- uio
- vfio-pci
これらのオプションは、make ファイルから調整できます。
UIO の場合、ifc_uio ドライバーは、sysfs を使用して BAR レジスター情報を読み出し、eventfds を使用して MSI-X 情報をレジスターします。
VFIO の場合、ユーザー空間は IOCTL コマンドを使用して、BAR レジスター、MSIX 情報、および IOMMU テーブルのプログラミングを読み出します。
通常、アプリケーションが仮想化環境で実行されている場合、デバイスを vfio-pci モジュールにバインドすると、 libmqdma は ioctl を使用してデバイスにアクセスできます。現在、UIO と VFIO のサポートは、common.mk ファイルから切り替えることができます。UIO はデフォルトで有効になっています。
サンプル・アプリケーション
- メッセージの合計サイズ/時間
- ディスクリプターあたりのパケットサイズ
- 読み出し/書き込み
- 完了報告方法
- チャネル数
DMA チャネルにアクセスするために複数のスレッドを実行します。また、パフォーマンス測定機能も備えています。使用しているスレッドの数と処理しているチャネルの数に基づいて、スレッドでキューがスケジュールされます。