をkernelspaceするユーザ空間からデータを渡します私は、より伝統的なシステムコール(読み書き/ ioctl)インタフェースではなく、Netlinkソケットを使うことを提案します。 Netlinkソケットを使用すると、構成データをソケット形式のインターフェイスを使用してカーネルに渡すことができます。これは、使用するのがはるかに簡単で安全です。
あなたのプログラムは、すべての入力解析と検証を実行し、大量のデータブロブよりも、より構造化された形式(例えば、エントリごとのエントリ)でデータをカーネルに渡す必要があります。
ハイスループット(メガバイト/秒)に興味がない限り、netlinkインターフェイスは問題ありません。あなたが保存することを計画している場合、限りアレイストレージが行くよう
http://en.wikipedia.org/wiki/Netlink
http://www.linuxjournal.com/article/7356
http://linux-net.osdl.org/index.php/Generic_Netlink_HOWTO
http://www.kernel.org/doc/Documentation/connector/
:以下のリンクは説明だけでなく、例を提供します128KBを超えるデータは、スペースを割り当てるためにvmalloc()を使用する必要があります。そうでない場合は、kmalloc()が優先されます。あなたは、Linuxのデバイスドライバブックの関連する章をお読みください:
http://lwn.net/images/pdf/LDD3/ch08.pdf
メモリページが連続していないので、vmallocで割り当てられたバッファは、()、デバイスから/へのDMAには適していませんのでご注意ください。あらかじめいくつのエントリーがあるかわからない場合は、リストのようなより複雑なデータ構造を検討することもできます。グローバルストレージにアクセスするためとして、あなたは任意のCプログラムのようにそれを行うことができます
:
extern struct my_struct *unique_name_that_will_not_conflict_with_other_symbols;
: あなたがデータにアクセスするために必要なすべての.cファイルによって含まれるヘッダファイルでは次のように何かを置きます
キーワードextern
は、これが別のソースファイルで実装されている変数を宣言していることを示します。これにより、このヘッダーを含むすべてのCファイルにこのポインタがアクセス可能になります。 はその後、Cファイル、あなたのコードの残りの部分とできれ1に - 1が存在する場合:ヘッダファイルで宣言された変数の実際の実装である
struct my_struct *unique_name_that_will_not_conflict_with_other_symbols = NULL;
を。
PS:Linuxカーネルで作業する場合は、Cでブラシをかける必要があります。そうしなければ、非常に不快な瞬間が訪れ、あなたは残念ながら痛いでしょう。
PS2:少なくとも、Linuxデバイスドライバの全書籍を読んでおけば、多くの時間を節約できます。その名前とその相対的な年齢にもかかわらず、Linuxカーネル用のコードを書くときには、最新かつ重要な情報がたくさんあります。
あなたが何を求めているのか分かりません...あなたの配列を含んでいるkmallocされた(またはたくさんのデータがあればvmallocされた)バッファへのポインタで十分でしょう。完了したら、必ず解放してください。 – thkala
申し訳ありませんが私は明確でない場合。このファイルは、システムの起動時に最初に読み込まれます。このデータは、カーネル内のいつでもアクセスする必要があります。基本的に、私はユーザー空間でヘルパープログラムを使ってファイルを解析しています。配列の結果をカーネル空間にコピーしてから、ユーザ空間プログラムを終了したいと思います。私はSockets.cファイル内のいつでもデータにアクセスできる必要があります。私はこれを正確に行う方法がわかりません。私の検索ではモジュールに関する多くの情報が得られましたが、これが「適切な」方法であるかどうかはわかりません。 – CxD