私は現在Linuxデバイスドライバについて学んでいますが、Linuxでデバイスがインスタンス化される方法について根本的な誤解があるようです。
Linuxモジュールでは、alloc_chrdev_region()
カーネルへのデバイス登録を呼び出すことができます。具体的には、
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor,
unsigned int count, char *name);
デバイス番号(州/部)を作成し、デバイス名を受け入れます。
正常に実行すると、/proc/devices
キーデバイス番号とデバイスタイプ名を含むエントリが生成されます。ただし、代わりにデバイスファイルを作成するには/dev
呼び出す必要があります。mknod
だから私の質問は:なぜ?
カーネルに登録するデバイスタイプ名とデバイス数をすでに指定しているため、これは不要なようです。デバイスファイルが自動的に生成されないのはなぜですか?
ベストアンサー1
alloc_chrdev_region()
デバイスノード/ファイルは生成されません。alloc_chrdev_region()
カーネルに一連の文字デバイス番号を要求すると、カーネルは使用可能なメジャー番号を動的に選択し、最初のマイナー番号とともに返します。
デバイスファイルを自動的に生成するには、を使用する必要がありますdevice_create()
。デバイスノードは通常クラスに関連付けられているため、device_create()
デバイスクラスを作成する必要があります。class_create()
見ている白関猫カーネルソースツリーのドライバはalloc_chrdev_region()
同じドライバ内で使用され使用されます。device_create()
これも簡単な例です。このコードは完全なコードではありません。
#define DRIVER_NAME "mydriver"
#define DRIVER_CLASS "mydriverclass"
static struct cdev my_device;
static struct file_operations fops = {
.owner = THIS_MODULE,
.open = driver_open,
.release = driver_close,
.read = driver_read,
.write = driver_write
};
static int __init ModuleInit(void) {
/* Allocate a device number */
alloc_chrdev_region(&my_device_nr, 0, 1, DRIVER_NAME)
/* Create device class */
my_class = class_create(THIS_MODULE, DRIVER_CLASS))
/* create device file */
device_create(my_class, NULL, my_device_nr, NULL, DRIVER_NAME)
/* Initialize device file */
cdev_init(&my_device, &fops);
/* Regisering device to kernel */
dev_add(&my_device, my_device_nr, 1)
return 0;
}