我是一名编写 Linux 内核模块的开发者。
以下是我在模块初始化函数中完成的内容:
register_chrdev(300 /* major */, "mydev", &fops);
功能正常。但我需要知道次要编号。
我已经阅读过,我们无法设置此次要编号。这是内核为我们提供的编号。如果是这样,如何在模块的初始化函数中知道它?
谢谢
我是一名编写 Linux 内核模块的开发者。
以下是我在模块初始化函数中完成的内容:
register_chrdev(300 /* major */, "mydev", &fops);
功能正常。但我需要知道次要编号。
我已经阅读过,我们无法设置此次要编号。这是内核为我们提供的编号。如果是这样,如何在模块的初始化函数中知道它?
谢谢
register_chrdev
会在内部调用 __register_chrdev
。
最初的回答:
register_chrdev
内部调用了 __register_chrdev
。
static inline int register_chrdev(unsigned int major, const char *name,
const struct file_operations *fops)
{
return __register_chrdev(major, 0, 256, name, fops);
}
__register_chrdev
函数的签名,它是"最初的回答"。int __register_chrdev(unsigned int major, unsigned int baseminor,
unsigned int count, const char *name,
const struct file_operations *fops)
register_chrdev
函数将使用主设备号(300)
和基本的次设备号0
以及设备数量256
。因此,它将为您的设备保留0-255的次设备号范围。
此外,在__register_chrdev
的定义中,会为您的设备创建dev_t
结构体(包含主设备号和次设备号)。
err = cdev_add(cdev, MKDEV(cd->major, baseminor), count);
count(256)
是可以进一步使用的连续次要编号。alloc_chrdev_region
,还可以动态获取主要和次要编号。您只需传递一个dev_t
结构到alloc_chrdev_region
即可。它会动态分配主要和次要编号给您的设备。要在模块中获取主要和次要编号,可以使用major = MAJOR(dev);
minor = MINOR(dev);
->init()
在模块加载时只运行一次。之后其他回调函数会被使用。 - 0andriy