1

以前にクエリを投稿しましたが、kernel2.6 に組み込まれている igmpv3 (Linux) を変更したいのと同じことを繰り返しています。ファイルから値を読み取り、igmpv3 パケット内の予約済み (res 1) 値を適切に決定するようにします。これはホストによって送信されます。

これは、ユーザー空間からカーネル空間の変数を変更するというより一般的な質問であると言って、上記の質問にさらに追加したいと思います。

その 1 つに対して ctuffli は次のように答えています。

ユーザー ランド プログラムの観点からは、ドライバーは、変更したい変数を含むコードではなく、適切に定義されたインターフェイスを備えた "ブラック ボックス" と考える必要があります。このメンタル モデルを使用すると、次の 4 つの方法 (インターフェイスなど) を使用して、制御情報をドライバーに伝達することを考慮する必要があります。

  • コマンド ライン オプション。初期化中に利用可能なカーネルモジュールにパラメーターを渡すことができます。
  • IOCTL。これは、制御情報をドライバーに渡す従来の方法ですが、このメカニズムは sysfs よりも使用するのが少し面倒です。
  • proc プロセス情報疑似ファイルシステム。proc は /proc ディレクトリにファイルを作成し、ユーザー ランド プログラムが読み書きできるようにします。以前は、このインターフェースはドライバーとの通信にも使用されていました。proc は sysfs に似ていますが、新しいドライバー (Linux 2.6) では代わりに sysfs を使用する必要があります。これは、proc の目的がプロセスのステータスを報告することだからです。
  • sysfs は、ドライバーとデバイスに関する情報をエクスポートするために使用される疑似ファイル システムです。

ドライバーと通信する必要がある時期 (つまり、初期化、実行時) に応じて、新しいコマンド ライン オプションまたは新しい sysfs エントリを追加して、ドライバーがパケット内の予約済みフィールドの値を処理する方法を変更する必要があります。

Ctuffli さん、ご回答ありがとうございます。sysfs についての知識はありません。詳細を教えていただけますか?igmpv3 pkt の予約値の 1 つを 0 または 1 または 2 のいずれかに変更したいと考えています。変更する必要があるのはこれだけです。この特定の問題の詳細を教えてください。

4

1 に答える 1

1

このSO answerには、 sysfs (つまり、/sys/...) インターフェイスの説明があります。

ドライバーに何を追加するかを具体的に説明します。つまり、次のとおりです。

static ssize_t mydrvr_version_show(struct device *dev,
        struct device_attribute *attr, char *buf)
{
    return sprintf(buf, "%s\n", DRIVER_RELEASE);
}

static DEVICE_ATTR(version, S_IRUGO, mydrvr_version_show, NULL);

ドライバーのセットアップ中:

device_create_file(dev, &dev_attr_version);
于 2014-05-22T14:26:54.223 に答える