2

/proc 経由でカーネルと通信するユーザーレベルのプログラムを取得しようとしています。

私はtldpの指示に従い、カスタム proc ファイルを作成し、それをinsmodで動的にロードし、ユーザーランドから proc ファイルを読み取り (cat) および書き込み (echo) することができました。

ここで私の質問は、システム コール インフラストラクチャなど、カーネルの別の部分から /proc 変数 (バイト バッファ) にアクセスするにはどうすればよいかということです。カスタム proc ファイルは動的にロードおよびリンクされるため、静的にコンパイルされたカーネル コードから参照するにはどうすればよいですか?

システム仕様: MacBook Pro 13" (2009) 上の VMWare Fusion で実行されている Ubuntu 10.10。

編集:関連コード(リクエストによる) -

procfile.c

//This function is called when the module is loaded
int init_module()
{
    /* create the /proc file */

    EXPORT_SYMBOL(procfs_buffer);
    EXPORT_SYMBOL(procfs_buffer_size);
...
...
}

get_procvariable.c (カーネルの別の部分)

//The buffer used to store character for this module
extern char * procfs_buffer;

//The size of the buffer
extern unsigned long procfs_buffer_size;

int get_procvariable(void)
{
.. do something
return procfs_buffer; // LD Error: Undefined reference
}

詳細が必要な場合は、コメントでお知らせください。前もって感謝します。

4

3 に答える 3

2

上記の回答からいくつかのヒントを得て、私自身の質問に回答しました。

私が見逃していた重要なことは、カーネル自体の中で変数を宣言する必要があったことです (たとえば、int kernel_var = 0;) (以前に間違って行ったように、procfs オーバーヘッド モジュール内ではありません)。その後、これを EXPORT_SYMBOL でエクスポートします。これにより、グローバル モジュール シンボル テーブルに追加され、最終的にオーバーヘッド procfs モジュールに extern 変数として含まれます。

基本的に、オーバーヘッド変数はカーネル内に既に存在し、procfs モジュールを使用してそれを extern 変数として参照し、その値を変更するだけです。

私はこの仮説をコード化しましたが、それは魔法のように機能しました。

于 2011-02-22T08:26:33.340 に答える
1

カーネルに動的にロードされたコード (つまり、モジュール) を、静的にロードされたコード (つまり、システムコール) から参照しないでください。静的にロードされたコードをカーネルに配置する場合、その構成は他の静的にロードされたコードによって公開される必要があります。ただし、実装している機能の種類を知らずに、これ以上具体的なアドバイスをすることは困難です。

于 2011-02-21T08:01:22.043 に答える
0

EXPORT_SYMBOL を使用してモジュールからシンボルをエクスポートし、カーネルの他の部分で使用します。

于 2011-02-19T06:39:03.383 に答える