2010-11-18 6 views
0

私はこの問題を解決しようとしています。ユーザー空間プログラムは、カーネルモジュールからの要求を取得するためにバッファをポーリングし続け、それを提供してからカーネルに応答します。カーネルモジュール内の既知の物理アドレスのメモリにアクセスするにはどうすればよいですか?

デバイスファイルを作成して通信するのではなく、ユーザースペースからメモリバッファを割り当てて、固定されているとマークして、メモリページがスワップアウトされることはありません。次に、ユーザ空間は特別なシステムコールを呼び出して、カーネルモジュールにそのバッファの物理アドレスを得ることができるように、カーネルにメモリバッファを伝える。 (ユーザスペースプログラムがコンテキストスイッチアウトされている可能性があるため、カーネルモジュールがその時点でバッファにアクセスしても仮想アドレスが何も意味しないからです。)

モジュールは要求を送信したいときに、物理アドレスを介してバッファリングする。問題は次のとおりです。物理アドレスを介してカーネルモジュール内のバッファにアクセスするにはどうすればよいですか。

私はget_user_pagesがあることに気づきましたが、それを使用する方法がわからない、あるいはもっと良い方法があるかもしれません。

ありがとうございました。

+0

どうすれば速くできますか?バッファを更新したことをカーネルに伝えるには、まだシステムコールを行う必要があります。 – mpe

+0

いいえ、カーネルスレッドは専用のコアで実行されており、応答をポーリングし続けます。 –

答えて

2

カーネルにバッファを割り当て、userspaceプログラムがmmap()を使用してアドレス空間にマップできるようにしてください。

+0

問題の場合に私がすべてをコントロールできるなら、それは良いでしょう。実際には、私はユーザー空間プログラムに要求を提供するためにメモリを割り当てる必要があります。クローズドソースのサードパーティ製のlibが必要です。実際には私のためにメモリを割り当てるlibです... –

1

は、最後に私が...この問題に対処する方法を考え出し

かなり単純だが安全ではないかもしれません。

__va(pa)を呼び出すphys_to_virtを使用して、カーネル内の仮想アドレスを取得し、そのバッファにアクセスできます。また、バッファが固定されているため、物理的な場所が確保できることが保証されます。

さらに、カーネルにバッファの情報を伝えるのに特別なsyscallは必要ありません。代わりに、私はカーネルに一度伝える必要があるので、procファイルで十分です。

関連する問題