Linuxでは、カーネル空間ではなくユーザー空間コードでデバイス割り込みを処理するためのオプションは何ですか?
経験によれば、ほとんどすべてのPCIアダプター用に優れた安定したユーザースペースドライバーを作成することが可能です。カーネルに洗練された小さなプロキシレイヤーが必要なだけです。 UIOはその方向への一歩ですが、ユーザースペースで割り込みを正しく処理したい場合、たとえばデバイスがUIOが依存するPCI仕様の割り込み無効ビットをサポートしていない場合、UIOでは不十分な場合があります。
プロセスのウェイクアップレイテンシーは数マイクロ秒であるため、実装に非常に低いレイテンシーが必要な場合は、ユーザースペースが足かせになる可能性があることに注意してください。
ユーザースペースドライバーを実装する場合は、カーネルISRを「disable&ack&wakeup-userpace」操作に減らし、ウェイクアッププロセス内で割り込みを処理してから、(の)割り込みを再度有効にします。もちろん、ユーザースペースプロセスからマップされたPCIメモリに書き込むことによって)。
[〜#〜] uio [〜#〜] がありますが、処理は引き続きカーネル空間で実行する必要があります。 OTOH、割り込みに気付くだけなら、カーネル部分は必要ありません。
ユーザーランドコードを間接的にトリガーする必要があります。
カーネル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で任意のユーザースペースプログラムから割り込みハンドラーを登録することは可能ですか?
第10章:割り込み処理 from Linux Device Drivers、Third Edition bookをご覧ください。