8

ユーザー空間アプリケーションが関数へのポインターをカーネル空間ドライバーに送信できるように、Linux で ioctl インターフェイスを拡張することは可能ですか?

特に、ユーザーが制御できる方法でストリームを処理する方法を考えていますが、カーネルで実行しています。これらの操作をカーネル モジュールにアタッチすることもできますが、開発中にカーネルをいじる必要がないため、開発がはるかに簡単になります。

より具体的には、これは次のプロセスになります。

  1. データはドライバーによってバッファーに読み取られます。
  2. データは、これらのユーザー定義関数によって適切に処理されます。
  3. おそらくいくつかのハードウェアブロックを使用して、さらに処理が行われます。
  4. データはユーザー空間アプリケーションによって使用されます。
4

3 に答える 3

9

ユーザー空間アプリケーションが開く1つ以上のキャラクターデバイス(またはブロックデバイス)をドライバーに提供させることで、目的を達成できると思います。

次に、カーネル->ユーザー空間イベント通信にinotify ( linux ジャーナル記事) を使用できます。ioctl またはユーザー空間用のデバイスへの書き込み -> カーネル イベント通信。データ交換は、1 つまたは複数のデバイス ファイルの読み取り/書き込みによっても実現できます。

または、/proc または /sys ファイルシステム エントリを指定するか、netlink を使用することもできます。

ksocketも検討してください:

Ksocket は、カーネル開発者が Linux カーネル空間でのネットワーク プログラミングを容易にするための bsd スタイルのソケット インターフェイス (つまり、ソケット、バインド、リッスン、接続、受け入れなど) を提供する Linux 2.6 カーネル モジュールです。ksocket が提供するインターフェースは、glibc での同等のものとほぼ同じであるため、カーネル空間の新しい開発者でも、カーネル ネットワーク関連のプログラムを開発する際に障壁はありません。

于 2010-04-22T11:43:30.067 に答える
3

あなたは四角い円を求めていると思います.カーネルが「ユーザーランド」機能を直接実行する場合、それは「ユーザーランド」ではなく、自作のロード可能なモジュールシステムになります. あなたが本当に望んでいるのは、間違いを犯すたびに PC をクラッシュさせることなく、すべてを機能させるために何をすべきかを理解する方法だと思います。「コールバック」の手段としてシグナルハンドラーを悪用することもできますが、どうやって戻ってくるかを指摘するにはあまりにもさびしいです関数呼び出しによるかのようにカーネルに戻ります。ここでの問題は、任意のユーザーランド -> カーネル コンテキスト スイッチで、カーネルが新しいスタックで開始されるため、リターン アドレスがなくなってしまうことです。シグナル ハンドラーを /dev/mem の mmap と組み合わせて、ユーザーランドの疑似ドライバーがカーネル モード ドライバーのデータ構造を直接突くようにするとどうなるでしょうか? しかし、ドライバーのデータ構造のみを mmap する方法を理解していない限り、間違いを犯したときに再起動に戻りますか? その他の再利用可能なメカニズムは、STREAMS および TTY 回線の規律です。これらはある種の変身能力を与えると思います。もちろん、これは永続的な解決策としては良い考えではありません!

于 2010-04-24T01:40:14.650 に答える
2

あなたのユースケースはデータに言及し続けます。

おそらく、カーネルとユーザープロセスの間でメモリを共有したいでしょう。データやコマンドを共有メモリに入れることができ、反対側のプロセス/カーネル コードがそれを読み取って何でも実行できます。get_user_pages_fast() 呼び出しは、プロセスが現在実行されていない場合でも、カーネルがプロセスのメモリにアクセスできるようにすることができます。

于 2010-05-05T05:27:49.297 に答える