2011-03-09 39 views
4

linuxに割り込みで非常に高速に応答することができるカスタムデバイスドライバを書き込んでいます。これを処理するコードはすでにユーザー空間の実装に存在していますが、ソフトウェアに依存して割り込みラインの状態を絶えずチェックしているため、遅すぎます。いくつかの調査をした後、私はあなたがカーネルモジュールからこれらの割り込みラインを登録し、関数ポインタによって与えられた関数を実行できることを発見しました。しかし、私たちが実行したいコードはユーザスペースにあります。カーネルスペースモジュールからユーザ空間の関数を呼び出す方法はありますか?カーネル空間からユーザ空間関数を実行

答えて

6

カーネルは個々のユーザー空間アプリケーションの機能とロジックについて知っているわけではないので、カーネルからユーザー空間関数を呼び出すことはできません。各ユーザー空間アプリケーション他のプロセスやカーネルがそのような方法で侵入することは許されていません(共有オブジェクトはここでは例外ですが、それでもカーネルスペースからはアクセスできません)。セキュリティモデルはどうでしょうで、最初にカーネルコンテキストでユーザスペースコード(カーネルコンテキストでは安全でないコードとみなされます)を実行することは想定されていません。その瞬間。あなたのアプローチを再考して、カーネル< - > User-space IPC and Interfaces、ファイルシステムまたはユーザーモードヘルパーAPI(以下を参照)に焦点を当てたいかもしれません。

ユーザスペースアプリは、カーネルからでもusermode-helper APIを使って呼び出すことができます。

Kernel APIs, Part 1: Invoking user-space applications from the kernel

+1

割り込み処理では、カーネルからユーザー空間アプリケーションを呼び出すことはお勧めできません。非常に例外的な場合にのみ使用されることを意図しています。 – kauppi

+0

@kauppi - あなたは正しいです、私はあなたのコメントを読んでいる分、私の目を通してフラッシュしているいくつかの悪夢のシナリオを経験しています...おそらく、opの唯一の解決策は、そのユーザスペースコードをカーネルコードに移植することです。ユーザスペースとカーネルスペースコミュニケーションを実現するためには、ユーザスペースのipc/interfaceが必要です。 – Shinnok

+0

カーネルからユーザースペースコードを呼び出すと、マルウェアの究極の攻撃ベクトルのように聞こえます。 –

2

があなたの割り込みラインのような音gpiolibを経由してユーザ空間にすでに提供されています:以下のIBM developerWorksの記事では、ユーザーモードヘルパーLinuxカーネルのAPIを使用して始める必要がありますか? (/ sys/class/gpio/...)

gpioエッジトリガーとpoll()が十分速い場合はベンチマークを行いましたか?そうすれば、ユーザ空間アプリケーションからステータスをポーリングする必要はありませんが、エッジトリガはpoll()を使ってステータスを報告します。カーネルソースのDocumentation/gpio.txtを参照してください。

sysfs経由のエッジトリガが十分でない場合、適切な方法は、時間の重要な部分を処理し、API(sysfs、デバイスノードなど)を介して結果をユーザ空間にエクスポートするカーネルドライバを開発することです。 。

5

私は最も簡単な方法は、デバイスがいくつかのデータを持っているときに準備ができている文字デバイスを登録することだと思う。

このデバイスからの読み取りを試みるすべてのプロセスは、デバイスが準備が整うまでスリープ状態になり、次に起動すると、適切な処理を実行できます。

レディネスを伝えたいだけなら、読者はただ1つのヌルバイトを読むことができます。

ユーザー空間プログラムは、ブロックするread()呼び出しを実行するだけで、目を覚ますまで適切にブロックされます。

これを使用するには、カーネルスケジューラの待機キューメカニズムを理解する必要があります。

0

私も同じ問題に直面しています。私はこの文書http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-6.htmlを読んで、信号を使用するよう計画しています。私の場合、信号を失う可能性はありません。
1.信号が実行された後、システムが閉ループになってから別の信号が得られます。
2. POSIXのリアルタイム信号を使用しています。

関連する問題