49

Linux カーネル用のモジュールを作成しており、init 関数でいくつかのデバイス ノードを作成したいと考えています。

int init_module(void)
{
    Major = register_chrdev(0, DEVICE_NAME, &fops);
 // Now I want to create device nodes with the returned major number
}

また、カーネルに最初のノードにマイナー番号を割り当ててもらいたいので、他のノードのマイナー番号を自分で割り当てます。

コードでこれを行うにはどうすればよいですか。mknod を使用してシェルからデバイスを作成したくない

4

3 に答える 3

77

デバイス番号とデバイスの作成をより詳細に制御するには、( の代わりにregister_chrdev())次の手順を実行できます。

  1. 呼び出しalloc_chrdev_region()て、メジャー番号と、使用するマイナー番号の範囲を取得します。
  2. を使用してデバイスのデバイス クラスを作成しますclass_create()
  3. デバイスごとに、cdev_init()およびを呼び出しcdev_add()て、キャラクター デバイスをシステムに追加します。
  4. 各デバイスについて、 を呼び出しますdevice_create()。その結果、とりわけ、Udevはデバイスのデバイス ノードを作成します。などは必要ありませんmknoddevice_create()デバイスの名前を制御することもできます。

ネット上にはおそらく多くの例があり、そのうちの 1 つがここにあります

于 2011-05-12T04:52:08.793 に答える
15
static int __init ofcd_init(void) /* Constructor */
{
    printk(KERN_INFO "Welcome!");
    if (alloc_chrdev_region(&first, 0, 1, "char_dev") < 0)  //$cat /proc/devices
    {
        return -1;
    }
    if ((cl = class_create(THIS_MODULE, "chardrv")) == NULL)    //$ls /sys/class
    {
        unregister_chrdev_region(first, 1);
        return -1;
    }
    if (device_create(cl, NULL, first, NULL, "mynull") == NULL) //$ls /dev/
    {
        class_destroy(cl);
        unregister_chrdev_region(first, 1);
        return -1;
    }
    cdev_init(&c_dev, &fops);
    if (cdev_add(&c_dev, first, 1) == -1)
    {
        device_destroy(cl, first);
        class_destroy(cl);
        unregister_chrdev_region(first, 1);
        return -1;
    }
    return 0;
}
于 2013-09-03T14:24:04.150 に答える