web-dev-qa-db-ja.com

カーネルモジュールパラメータと/ sys / class / ...の説明

私は(私の最初の)カーネルモジュールを作成して、パンダボードのgpioピンと割り込みを再生していました。

すでに「組み込み」で、(簡単に)できることに気づきました

cd /sys/class/gpio
echo 138 > export  # a file gpio138 appears    
echo out > gpio138/direction
echo 1 > gpio138/value

コネクタピンの電圧を高くまたは低くします。

同様に、カーネルモジュールにはモジュールパラメータがあり、たとえばecho 3 > /sys/module/my_module/parameters/delay_secondsを実行できます。

私の質問:

  1. / sys/class/gpioを処理するものは何ですか?カーネルモジュール?ドライバー ?

  2. 1.が何であれ、いくつかのディレクトリ構造を使用して、カーネルモジュールにさらに複雑なモジュールパラメータを含めることは可能ですか?遅延のパラメータを含む「delays」ディレクトリのように、... /sys/module/my_module/parameters/delays/delay_led1_seconds

  3. パス/ sys/module/my_module/parameters/...以外の場所にパラメーターを設定できますか? (/ sys/class/a_name/...など)

  4. [un]exportに書き込むときに、gpioはどのようにして/ sys/class/gpioに新しいファイルを作成/削除しますか?

4
Thomas

1)/ sys/class/gpioを処理するものは何ですか?カーネルモジュール?ドライバー ?

これは カーネルインターフェイス/procディレクトリに似ています。

2)いくつかのディレクトリ構造で、カーネルモジュールにもっと複雑なモジュールパラメータを含めることは可能ですか?遅延のパラメータを含む「delays」ディレクトリのように

はい; /procおよび/sysの一部は、ディレクトリ階層を使用します。ただし、それらを変更または拡張する場合は、カーネルを変更する必要があります。

#3にも同様の答えがあります。変更を加えるには、関連するカーネルコードを変更する必要があります。

4)[un] exportに書き込むと、gpioはどのようにして/ sys/class/gpioに新しいファイルを作成/削除しますか?

これらはディスク上のファイルではなく、単なるシステムインターフェイスです。1 procfsまたはsysfsファイルからデータを読み取る場合、実際に行っているのは、カーネルからの情報の要求です。次に、データがフォーマットされて返されます。一部はカーネルに格納されている可能性がありますが、表示されている形式ではおそらくどこにも格納されていません。

そのようなファイルに書き込むとき(すべてがこれを許可しているわけではありません)、特定のことを行うようにカーネルに要求を送信しています。これには、たとえば、GPIOインターフェースのアクティブ化または拡張が含まれます。


1. readおよびwrite呼び出しは常に システムコール とにかく、通常のファイルは通常ディスク上にあり、ハードウェアにアクセスするにはカーネルが必要であるためです。したがって、ここでファイルシステムスタイルのAPIを使用するのは自然なことです。それらが「実際のファイル」でなくても、それらが表すリソースにアクセスするには、システムコールが必要です。

2
goldilocks
  1. パス/ sys/module/my_module/parameters/...以外の場所にパラメーターを設定できますか? (/ sys/class/a_name/...など)

パラメータには/ sys/class/module_name/*を使用しますが、非常に簡単に使用できます。例として http://lxr.free-electrons.com/source/drivers/gpio/gpiolib.c#L757 のコードを参照してください(読み取り専用属性の例もあります __ ATTR_RO )。

static struct class_attribute gpio_class_attrs[] = {
        __ATTR(export, 0200, NULL, export_store),
        __ATTR(unexport, 0200, NULL, unexport_store),
        __ATTR_NULL,
};

static struct class gpio_class = {
        .name =         "gpio",
        .owner =        THIS_MODULE,

        .class_attrs =  gpio_class_attrs,
};

/*
 * /sys/class/gpio/export ... write-only
 *      integer N ... number of GPIO to export (full access)
 * /sys/class/gpio/unexport ... write-only
 *      integer N ... number of GPIO to unexport
 */
static ssize_t export_store(struct class *class,
                                struct class_attribute *attr,
                                const char *buf, size_t len)
{
    // ...

ところで。論文を読むことをお勧めします PatrickMochelによるsysfsファイルシステム およびGreg Kroah-Hartmanによる短いブログ投稿 sysfsファイルを正しく作成する方法

1
pevik