各ユーザー空間アプリケーションには独自のメモリがあることは言うまでもなく、カーネルは個々のユーザー空間アプリケーションの関数とロジックを認識していないため、カーネルからユーザー空間関数を呼び出すことはできません。他のプロセスやカーネルがそのように侵入することは許可されていません (ここでは共有オブジェクトは例外ですが、それでもカーネル空間からそれを利用することはできません)。セキュリティ モデルについてはどうですか。そもそもカーネル コンテキストでユーザー空間コード (カーネル コンテキストでは安全でないコードと自動的に見なされる) を実行することは想定されていません。その瞬間。上記のすべてに加えて、アプローチを再考し、カーネル <-> ユーザー空間の IPC とインターフェイス、ファイル システム、またはユーザー モード ヘルパー API (以下を参照) に焦点を当てたいと思う他の多くの動機を考慮してください。
ただし、usermode-helper API を使用して、カーネルからユーザー空間アプリを呼び出すことができます。次の IBM DeveloperWorks 記事は、ユーザーモード ヘルパー Linux カーネル API の使用を開始するためのものです。
カーネル API、パート 1:カーネルからのユーザー空間アプリケーションの呼び出し
デバイスにデータがあると準備が整うキャラクターデバイスを登録するのが最も簡単な方法だと思います。
このデバイスから読み取ろうとするすべてのプロセスは、デバイスの準備が整うまでスリープ状態になり、その後、適切な処理を実行できる時点でウェイクアップされます。
準備ができていることを知らせるだけなら、リーダーは 1 つの null バイトを読み取るだけで済みます。
ユーザー空間プログラムは、ブロッキング read() 呼び出しを実行するだけでよく、ウェイクアップするまで適切にブロックされます。
これを使用するには、カーネル スケジューラの待機キュー メカニズムを理解する必要があります。
割り込みラインは、gpiolib を介してユーザー空間で既に利用できるようですか? (/sys/class/gpio/...)
gpio エッジ トリガーと poll() が十分に高速かどうかをベンチマークしましたか?そうすれば、ユーザー空間アプリケーションからステータスをポーリングする必要はありませんが、エッジ トリガーは poll() を介してそれを報告します。カーネル ソースの Documentation/gpio.txt を参照してください。
sysfs を介したエッジ トリガーが十分でない場合、適切な方法は、タイム クリティカルな部分を処理し、API (sysfs、デバイス ノードなど) を介して結果をユーザー空間にエクスポートするカーネル ドライバーを開発することです。