web-dev-qa-db-ja.com

ユーザースペースでのLinux割り込み処理

Linuxでは、カーネル空間ではなくユーザー空間コードでデバイス割り込みを処理するためのオプションは何ですか?

16

経験によれば、ほとんどすべてのPCIアダプター用に優れた安定したユーザースペースドライバーを作成することが可能です。カーネルに洗練された小さなプロキシレイヤーが必要なだけです。 UIOはその方向への一歩ですが、ユーザースペースで割り込みを正しく処理したい場合、たとえばデバイスがUIOが依存するPCI仕様の割り込み無効ビットをサポートしていない場合、UIOでは不十分な場合があります。

プロセスのウェイクアップレイテンシーは数マイクロ秒であるため、実装に非常に低いレイテンシーが必要な場合は、ユーザースペースが足かせになる可能性があることに注意してください。

ユーザースペースドライバーを実装する場合は、カーネルISRを「disable&ack&wakeup-userpace」操作に減らし、ウェイクアッププロセス内で割り込みを処理してから、(の)割り込みを再度有効にします。もちろん、ユーザースペースプロセスからマップされたPCIメモリに書き込むことによって)。

7
Dan Aloni

[〜#〜] uio [〜#〜] がありますが、処理は引き続きカーネル空間で実行する必要があります。 OTOH、割り込みに気付くだけなら、カーネル部分は必要ありません。

5
ninjalj

ユーザーランドコードを間接的にトリガーする必要があります。

カーネルISRは、ファイルの書き込み/レジスタの設定/シグナリングによって割り込みを示します。ユーザースペースアプリケーションはこれをポーリングし、適切なコードを実行します。エッジケース:予想よりも多かれ少なかれ割り込み(タイムアウト/時間間隔あたりの割り込みが多すぎる)

Linuxファイルの抽象化は、カーネルとユーザースペースを接続するために使用されます。これは、キャラクターデバイスとioctl()呼び出しによって実行されます。この目的のためにsysfsエントリを好む人もいます。

イベントトリガーデバイス通知(割り込み)は「時間トリガー」ポーリングにフックされているため、これは奇妙に見えるかもしれませんが、実際には非同期ブロッキング(読み取り/選択)です。とにかく、パフォーマンスに応じていくつかの質問が発生しています。

そのため、割り込みをカーネルの外部で直接処理することはできません。例えば。共有メモリはユーザースペースに配置でき、一部のI/Oアクセス許可設定を使用してアドレスをマップできるため、U-I/Oは機能しますが、直接割り込み処理には使用できません。

トピックvfioで「マイノリティレポート」を1つだけ見つけました( http://lxr.free-electrons.com/source/Documentation/vfio.txt ): https:// stackoverflow .com/a/21197797/5349798

同様の質問:

Linuxでの割り込みのコンテキストでのユーザースレッドの実行

Linuxで任意のユーザースペースプログラムから割り込みハンドラーを登録することは可能ですか?

Linuxカーネル:カーネル空間からユーザー空間でコールバック関数を呼び出す

Linux割り込みとポーリング

LinuxユーザースペースPCIドライバー

Linuxでドライバーが割り込みを受信したことをユーザースペースアプリケーションに通知するにはどうすればよいですか?

2
renonsz
2