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. ユーザ空間からカーネル空間へのmemcpy
- 2. ユーザ空間とカーネル空間の間でメモリを共有する
- 3. カーネル空間とユーザ空間の時間の差異
- 4. std :: threadsはユーザ空間またはカーネル空間で管理されますか?
- 5. シグナルハンドラはカーネルまたはユーザ空間で実行されますか?
- 6. カーネルとユーザ空間の間の共有メモリセグメントの保護
- 7. メモリマップの構造カーネル空間
- 8. linuxカーネル空間のユーザー空間スタックトレースを表示するには
- 9. ユーザ空間またはカーネル空間にJavaスレッドが作成されていますか?
- 10. Linuxカーネル、ユーザ空間のバッファ、access_okを実行して待機して競合状態を作成しますか?
- 11. Linuxのカーネル空間からioctl()を使用するには?
- 12. カーネル空間からパケットにデータを追加するには?
- 13. Linuxカーネルからユーザー空間のメモリにアクセスするには?
- 14. カーネル空間から返された構造体をユーザ空間にコピーすることは不可欠ですか?
- 15. ユーザ空間メモリへのOpenGL ESレンダリング
- 16. XSLT関数と名前空間
- 17. 名前空間の関数テンプレートのオーバーロード
- 18. 関数実装で名前空間を使用する
- 19. ユーザ空間からIF_RA_MANAGEDとIF_RA_OTHERCONFにアクセスする
- 20. SISO伝達関数からの状態空間システムの形成
- 21. パラレル空間のような複数のアンドロイドアプリインスタンスを実行
- 22. このコードの実行時間と空間の複雑さ
- 23. 変数の名前空間
- 24. 定数空間のMonadic Fold
- 25. カーネル空間からlinux/procファイルを読み書きするには?
- 26. PHPでの空関数の実行
- 27. 異なる名前空間から名前空間のリソースを作成する
- 28. 座標をある空間から別の空間に変換する
- 29. Linuxカーネル空間内でリングバッファを読み取る方法は?
- 30. 構造体配列をカーネル空間に格納する、Linux
割り込み処理では、カーネルからユーザー空間アプリケーションを呼び出すことはお勧めできません。非常に例外的な場合にのみ使用されることを意図しています。 – kauppi
@kauppi - あなたは正しいです、私はあなたのコメントを読んでいる分、私の目を通してフラッシュしているいくつかの悪夢のシナリオを経験しています...おそらく、opの唯一の解決策は、そのユーザスペースコードをカーネルコードに移植することです。ユーザスペースとカーネルスペースコミュニケーションを実現するためには、ユーザスペースのipc/interfaceが必要です。 – Shinnok
カーネルからユーザースペースコードを呼び出すと、マルウェアの究極の攻撃ベクトルのように聞こえます。 –