我怎么知道Linux模块初始化的未成年人

时间:2019-04-11 12:28:28

标签: linux-kernel

我正在编写一个Linux内核模块。

这是我在模块的init函数中所做的事情:

register_chrdev(300 /* major */, "mydev", &fops);

工作正常。但是我需要知道次要号码。

我已阅读我们无法设置此次要号码。正是内核给了我们这个数字。如果是这样,我怎么在模块的init函数中知道它?

谢谢

1 个答案:

答案 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);