5

私は新しい Linux TCP cong アルゴリズムの実装を作成し、このコードにいくつかの静的変数を持っているので、いくつかの構成方法を使用してそれらを動的にしたいと考えています。

カーネルレベルのプログラミングでの私の理解によると、テキストファイルをロードしてそこに値を入れて、プログラムを介して読み取ることはできません..

しかし、ユーザーが値を変更するたびにカーネルコードをコンパイルせずにユーザーが値を変更できるように、これらの値を動的にするために何か他のものが必要です。

proc エントリが役立つと聞いたことがありますが、それが正しい方法かどうかはわかりません。ioctl() も役立つかどうかわかりません。

これらの変数を動的にする方法についていくつかのアイデアを与えることができるので、その場で変更して値を設定できます..

4

2 に答える 2

2

モジュールパラメータを使用することをお勧めします。

#include <linux/moduleparam.h>をカーネル モジュールに含めます。

module_param()変数を使用module_param_array()して、配列をカーネルモジュールに渡します。

モジュールに値を渡す方法については、 Linux カーネル モジュールのコマンド ライン引数として配列を渡すを参照してください。

これは module_param() のサンプルプログラムです

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/moduleparam.h>

#include "MyHeader.h"

int a = 0, b = 0, op = 0;


module_param(a, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
module_param(b, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
module_param(op, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);

int __init init_module(void)
{
  printk("\n Second Module Loaded...... \n");

  if((a == 0) && (b == 0) && (op == 0))
  {     
         printk("\n Supply Module Parameters...... \n");
         printk("\n insmod <modulename>.ko op=<1-4> a=<int data> b=<int data> \n");
         return 0;
  }

 switch(op)
  {
    case 1:
         printk("\n Result of Addition:%d \n", add(a,b));
         break;
    case 2:
         printk("\n Result of Subtraction:%d \n", sub(a,b));
         break;
    case 3:
         printk("\n Result of Multiplication:%d \n", mul(a,b));
         break;
    case 4:
         printk("\n Result of Division:%d \n", div(a,b));
         break;
    default:
         printk("\n Unknown Operation... \n");
  }

  return 0;
}

void cleanup_module()
{
  printk("\n Second Module UN--Loaded...... \n");
}

配列をカーネル モジュールに渡す別のサンプル。

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/moduleparam.h>

int a[5];
int count;
module_param_array(a, int, &count, 0);

int init_module(void)
{

    int i = 0;
    printk("\n Welcome to sample kernel module \n");

    for(i = 0; i < count; i++)
    {
       printk("\na[%d] = %d", i, a[i]);
    }

    return 0;

}

void cleanup_module()
{
     printk("\n Exit success \n");
}

モジュール param とは別に、他の代替案も次のリンクで提案されています。 http://kernelnewbies.org/FAQ/WhyWritingFilesFromKernelIsBad

于 2012-12-05T06:11:13.510 に答える
1

多くのカーネル モジュールはファイルシステムにファイルを配置します/proc。実際にデータはファイルとして表示され、通常のユーザー空間ファイル操作で変更できます。

sysctl インターフェイスもあります。

于 2012-12-05T06:17:35.660 に答える