GNU/Linux >> Linux の 問題 >  >> Linux

カーネル空間からユーザー空間関数を実行する

各ユーザー空間アプリケーションには独自のメモリがあることは言うまでもなく、カーネルは個々のユーザー空間アプリケーションの関数とロジックを認識していないため、カーネルからユーザー空間関数を呼び出すことはできません。他のプロセスやカーネルがそのように侵入することは許可されていません (ここでは共有オブジェクトは例外ですが、それでもカーネル空間からそれを利用することはできません)。セキュリティ モデルについてはどうですか。そもそもカーネル コンテキストでユーザー空間コード (カーネル コンテキストでは安全でないコードと自動的に見なされる) を実行することは想定されていません。その瞬間。上記のすべてに加えて、アプローチを再考し、カーネル <-> ユーザー空間の 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、デバイス ノードなど) を介して結果をユーザー空間にエクスポートするカーネル ドライバーを開発することです。


Linux
  1. Linuxカーネルテストのライフサイクル

  2. 20.04リポジトリからUbuntu18.04にカーネル5.13をインストールする方法

  3. ユーザーグループルートの機能??

  1. デバイスからユーザー空間メモリーへの DMA への Linux カーネル デバイス ドライバー

  2. Linux カーネルの `struct file_operations` で close 関数が release と呼ばれるのはなぜですか?

  3. カーネルがプロセスと同じアドレス空間にマップされるのはなぜですか?

  1. 空きスペースはどうなりましたか?

  2. カーネルモジュールコードにポーリング機能を追加するには?

  3. Linux カーネルからメモリのブロックを予約するにはどうすればよいですか?