我正在编写一个Linux内核模块。
这是我在模块的init函数中所做的事情:
register_chrdev(300 /* major */, "mydev", &fops);
工作正常。但是我需要知道次要号码。
我已阅读我们无法设置此次要号码。正是内核给了我们这个数字。如果是这样,我怎么在模块的init函数中知道它?
谢谢
答案 0 :(得分:1)
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);
MKDEV(cd->major, baseminor)
创建它。因此,第一个设备编号(dev_t
)将0
作为其次要编号。此外,count(256)
是可以进一步使用的连续次要数字。
如果您使用alloc_chrdev_region
,则还可以动态获取主要和次要号码。您要做的就是传递一个dev_t
结构
到alloc_chrdev_region
。它将为您的设备动态分配主要和次要编号。要获取模块中的主要和次要号码,您可以使用
major = MAJOR(dev);
minor = MINOR(dev);