linuxに割り込みで非常に高速に応答することができるカスタムデバイスドライバを書き込んでいます。これを処理するコードはすでにユーザー空間の実装に存在していますが、ソフトウェアに依存して割り込みラインの状態を絶えずチェックしているため、遅すぎます。いくつかの調査をした後、私はあなたがカーネルモジュールからこれらの割り込みラインを登録し、関数ポインタによって与えられた関数を実行できることを発見しました。しかし、私たちが実行したいコードはユーザスペースにあります。カーネルスペースモジュールからユーザ空間の関数を呼び出す方法はありますか?カーネル空間からユーザ空間関数を実行
答えて
カーネルは個々のユーザー空間アプリケーションの機能とロジックについて知っているわけではないので、カーネルからユーザー空間関数を呼び出すことはできません。各ユーザー空間アプリケーション他のプロセスやカーネルがそのような方法で侵入することは許されていません(共有オブジェクトはここでは例外ですが、それでもカーネルスペースからはアクセスできません)。セキュリティモデルはどうでしょうで、最初にカーネルコンテキストでユーザスペースコード(カーネルコンテキストでは安全でないコードとみなされます)を実行することは想定されていません。その瞬間。あなたのアプローチを再考して、カーネル< - > User-space IPC and Interfaces、ファイルシステムまたはユーザーモードヘルパーAPI(以下を参照)に焦点を当てたいかもしれません。
ユーザスペースアプリは、カーネルからでもusermode-helper APIを使って呼び出すことができます。
Kernel APIs, Part 1: Invoking user-space applications from the kernel
があなたの割り込みラインのような音gpiolibを経由してユーザ空間にすでに提供されています:以下のIBM developerWorksの記事では、ユーザーモードヘルパーLinuxカーネルのAPIを使用して始める必要がありますか? (/ sys/class/gpio/...)
gpioエッジトリガーとpoll()が十分速い場合はベンチマークを行いましたか?そうすれば、ユーザ空間アプリケーションからステータスをポーリングする必要はありませんが、エッジトリガはpoll()を使ってステータスを報告します。カーネルソースのDocumentation/gpio.txtを参照してください。
sysfs経由のエッジトリガが十分でない場合、適切な方法は、時間の重要な部分を処理し、API(sysfs、デバイスノードなど)を介して結果をユーザ空間にエクスポートするカーネルドライバを開発することです。 。
私は最も簡単な方法は、デバイスがいくつかのデータを持っているときに準備ができている文字デバイスを登録することだと思う。
このデバイスからの読み取りを試みるすべてのプロセスは、デバイスが準備が整うまでスリープ状態になり、次に起動すると、適切な処理を実行できます。
レディネスを伝えたいだけなら、読者はただ1つのヌルバイトを読むことができます。
ユーザー空間プログラムは、ブロックするread()呼び出しを実行するだけで、目を覚ますまで適切にブロックされます。
これを使用するには、カーネルスケジューラの待機キューメカニズムを理解する必要があります。
私も同じ問題に直面しています。私はこの文書http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-6.htmlを読んで、信号を使用するよう計画しています。私の場合、信号を失う可能性はありません。
1.信号が実行された後、システムが閉ループになってから別の信号が得られます。
2. POSIXのリアルタイム信号を使用しています。
- 1. カーネル空間からユーザ空間にパケットをバイパスする
- 2. ユーザ空間からカーネル空間へのmemcpy
- 3. ユーザ空間とカーネル空間の間でメモリを共有する
- 4. カーネル空間とユーザ空間の時間の差異
- 5. カーネル空間内のmalloc関数
- 6. Linuxユーザー空間とカーネル空間スケジューリング
- 7. std :: threadsはユーザ空間またはカーネル空間で管理されますか?
- 8. シグナルハンドラはカーネルまたはユーザ空間で実行されますか?
- 9. カーネルとユーザ空間の間の共有メモリセグメントの保護
- 10. メモリマップの構造カーネル空間
- 11. 、Linuxではカーネル空間
- 12. 画像処理 - カーネル空間、関数、データとは何ですか?
- 13. カーネル/ユーザアドレス空間間の共有ロックフリーキュー
- 14. linuxカーネル空間のユーザー空間スタックトレースを表示するには
- 15. ユーザ空間バスエラーからのLinux DMA
- 16. カーネル空間からユーザ空間へ物理メモリへのポインタを渡して仮想空間にマップする方法
- 17. ユーザ空間またはカーネル空間にJavaスレッドが作成されていますか?
- 18. ODBCドライバはカーネル空間またはユーザ空間で動作しますか?どうして?
- 19. 他の名前空間内の名前空間からの関数の使用
- 20. 色空間からカメラ空間への変換行列
- 21. Unixユーザ空間のリアルタイムIPC
- 22. 空間関数はHIVE
- 23. Linuxカーネル、ユーザ空間のバッファ、access_okを実行して待機して競合状態を作成しますか?
- 24. PHP:フォルダのユーザ空間を取得し、全ユーザ空間に関連するパーセンテージとして返します。
- 25. Linuxカーネルのユーザー空間ライブラリmodal - テスト用
- 26. カーネル空間からパケットにデータを追加するには?
- 27. SKBをカーネル空間から送信するために
- 28. Linuxのカーネル空間からioctl()を使用するには?
- 29. 名前空間の別の名前空間からのjavascriptアクセス関数ajax関数のコールバック
- 30. 環境変数はカーネル空間の一部ですか?
割り込み処理では、カーネルからユーザー空間アプリケーションを呼び出すことはお勧めできません。非常に例外的な場合にのみ使用されることを意図しています。 – kauppi
@kauppi - あなたは正しいです、私はあなたのコメントを読んでいる分、私の目を通してフラッシュしているいくつかの悪夢のシナリオを経験しています...おそらく、opの唯一の解決策は、そのユーザスペースコードをカーネルコードに移植することです。ユーザスペースとカーネルスペースコミュニケーションを実現するためには、ユーザスペースのipc/interfaceが必要です。 – Shinnok
カーネルからユーザースペースコードを呼び出すと、マルウェアの究極の攻撃ベクトルのように聞こえます。 –