2010-11-23 16 views
0

私はこの問題をちょっと考えすぎるかもしれないと信じています...私はブート時に解析して結果を配列に格納するファイルシステム上にあるテキストファイルを持っていますの構造体。この配列をユーザスペースからカーネルスペース(copy_from_user)にコピーする必要があり、いつでもカーネルがこのデータにアクセスできるようにする必要があります。カーネル空間のデータは、Sockets.cファイルによってアクセスされる必要があります。カーネル空間内に配列を格納する特別な場所はありますか、単にSockets.cの配列への参照を追加できますか?私のCは少し錆びています...構造体配列をカーネル空間に格納する、Linux

ありがとうございます。

+0

あなたが何を求めているのか分かりません...あなたの配列を含んでいるkmallocされた(またはたくさんのデータがあればvmallocされた)バッファへのポインタで十分でしょう。完了したら、必ず解放してください。 – thkala

+0

申し訳ありませんが私は明確でない場合。このファイルは、システムの起動時に最初に読み込まれます。このデータは、カーネル内のいつでもアクセスする必要があります。基本的に、私はユーザー空間でヘルパープログラムを使ってファイルを解析しています。配列の結果をカーネル空間にコピーしてから、ユーザ空間プログラムを終了したいと思います。私はSockets.cファイル内のいつでもデータにアクセスできる必要があります。私はこれを正確に行う方法がわかりません。私の検索ではモジュールに関する多くの情報が得られましたが、これが「適切な」方法であるかどうかはわかりません。 – CxD

答えて

1

カーネルのどこかにexternポインタを定義することができます(たとえば、それを使用するファイルsockets.c)。 NULLに初期化し、適切なヘッダーファイルに宣言を含めます。

copy_from_user()を実行するコードの部分では、kmalloc()を使用して配列の領域を割り当て、そのアドレスをポインタに格納します。それにデータをコピーします。また、配列へのアクセスを回避するために、ミューテックスをロックする必要があります。

kmalloc()によって割り当てられたメモリは、kfree()で解放されるまで保持されます。

+0

ありがとうございます。 :) – CxD

1

あなたの質問は、練習の一部をthis bookで行うことをお勧めします。第8章全体は、カーネルメモリの割り当て専用です。

6

私はあなたの問題で2つの主要な部分があると信じて:

  • kernelspace最初の場合

にデータを格納する

  • を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カーネル用のコードを書くときには、最新かつ重要な情報がたくさんあります。

  • +0

    netlinkはioctlより簡単で安全ではないので、netlinkを使用すべきではありませんが、ioctlsには何も問題はありません。 – mpe

    +0

    @mpe:ユーザスペースAPIはより使い慣れており、netlinkカーネルの機能は幾分高いレベルにあるという意味です。さもなければ、あなたはカーネル内の他のものとできるだけ多くをネットリンクで混乱させることができます: - / – thkala