2011-10-30 9 views
2

問題を解決するためのいくつかの適切な例が見つかりません。私はユーザーとカーネル空間の間で4K(4096)バイトのデータを共有したい。私は、カーネルからメモリを割り当てて、それをユーザー空間でmmapしなければならないという多くのアイデアを見つけました。誰かがLinux 2.6.38でそれを行う方法の例を提供することができます。それを説明する良い文書はありますか?mmapを使用してユーザースペースとカーネルスレッドを共有する方法

ありがとうございます。

+0

ここには1つの実装があります:http://people.ee.ethz.ch/~arkeller/linux/kernel_user_space_howto.html#s8 – Mat

+0

私はこれを見ました。これはdebugfsを使用します。このdebugfsを避けるには? – max

答えて

4

あなたの提案された方法は1つの方法ですが、ユーザー空間があなたのコントロールの範囲内にないため(ユーザー空間プログラムがカーネルを突き破る可能性があることを意味します)、ユーザー空間からの悪意のある攻撃の可能性を広げています。このカーネルベースのメモリ共有-と、ユーザ空間にも、ここで説明されています

http://www.scs.ch/~frey/linux/memorymap.html

代わりに、どのようにユーザ空間にメモリを割り当てについて、その後、カーネルからは、API copy_from_user()とcopy_to_user()を使用しコピーしますユーザー空間のメモリに/から?もしあなたが異なるプロセス間でメモリを共有したいのであれば、uはいつもIPCに関連するAPIを使ってメモリを割り当てたり、shmget()などのメモリを定義したりできます。この場合、カーネルソース自体にはたくさんのサンプルコードがあります。

例えば、

fs/checksum.c:missing = __copy_from_user(dst、src、len);

+0

このリンクは私のためにメモリマッピングを取得するのに役立ちました。私は最初にユーザー空間からメモリを割り当てて、ポインタをカーネル空間に渡してcopy_from_user経由で使用しようとしました。しかし、問題は、私はカーネルスレッドからアクセスする必要があり、カーネルスレッドは常に私のプロセスコンテキストの下で実行されないので、copy_from_userは自分の希望するメモリからコピーしません。 – max

+0

私は、それはあなたが1つのユーザープロセス間でメモリを共有しているのではなく、多くのユーザープロセスとカーネル間でメモリを共有しているということですか?もしそうなら、カーネルに一度だけ割り当ててから、それをユーザ空間にmmapする方が良いでしょう。これは、同じカーネルメモリ領域を指し示している多くのページング可能なエントリを(各プロセスのユーザー空間コンポーネントに対して、それらはすべて同じカーネルコンポーネントを共有していますが)作成していることを意味します。パフォーマンスは非常に悪くなります。通常のページフォールトメカニズムを使用して、各更新が同期してすべてのプロセスに複製されるためです。 –

+0

プロセスインスタンスは1つのみです。そのプロセスからの複数のスレッドがあります。また、システムコールから複数のカーネルスレッドが作成されます。これらのカーネルスレッドとユーザーレベルのスレッドはメモリを共有します。カーネルレベルのスレッドは何かを置きます。ユーザースレッドはそれをピックアップします。そしてそのようなもの。 – max

関連する問題