2009-10-26 6 views
5

私の質問は、カーネルからユーザー空間プログラムにデータを渡すことです。私はシステムコール "get_data(size、char * buff、char ** meta_buf)"を実装したいと思います。この呼び出しでは、buffはユーザー空間プログラムによって割り当てられ、その長さはsize引数に渡されます。しかし、meta_bufは、(ユーザー空間プログラムのvmページに)割り当てられ、カーネルで埋められる可変長バッファです。ユーザー空間プログラムはこの地域を解放するでしょう。カーネルスレッドからユーザー空間用のメモリを割り当てる

(私はユーザスペースプログラムがmeta_buffのサイズを知らないので、ユーザスペースにデータを割り当てません。また、ユーザスペースプログラムは一定量のメモリを割り当てられず、システムコールを何度も呼び出すことでメタデータ全体1つのシステムコールで返されなければならない)

  1. カーネルスレッドからユーザスペースプログラムのメモリを割り当てるにはどうすればよいですか? (同様の操作を行う他のシステムコールを指し示すことができれば、カーネルに割り当て、ユーザスペースを解放することができます)
  2. このインタフェースは正しいのですか、それとも良い方法がありますか?
+0

最小実行可能な例:https://stackoverflow.com/questions/10760479/how-to-mmap-a-linux-kernel-buffer-to-user-space/45645732#45645732 –

答えて

11

カーネルからユーザー空間用のメモリを割り当てようとしません。これは、カーネルの抽象化レイヤーに大きな違反です。代わりに、いくつかの他のオプションを検討してください:

  • 必要なスペースをユーザスペースに問い合わせてください。 Userspaceが割り当てられ、カーネルからメモリを取得します。
  • ドライバによって所有されているユーザー空間のmmapページをそのアドレス空間に直接持っています。
  • 必要なデータ量の上限を設定します。それだけを割り当ててください。

なぜこれが原子である必要があります。実際にはメモリを割り振る必要があります(または成功する可能性は低い)ので、カーネルに出入りすることは大いに傷つくことはありません。実際には、のいずれかユーザー空間メモリへの書き込みは、IOが必要なページフォルトが発生する可能性があるため、は割り込み可能でなければなりません。

関連する問題