如何在Linux模块初始化时知道次设备号

3

我是一名编写 Linux 内核模块的开发者。

以下是我在模块初始化函数中完成的内容:

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

功能正常。但我需要知道次要编号。

我已经阅读过,我们无法设置此次要编号。这是内核为我们提供的编号。如果是这样,如何在模块的初始化函数中知道它?

谢谢


你简单地不能这样做。->init()在模块加载时只运行一次。之后其他回调函数会被使用。 - 0andriy
从一开始就问自己为什么需要知道它? - 0andriy
我需要知道分配给我的模块的次要编号。 - Bob5421
你为什么需要它?你还没有回答。也许其他人可以帮助你。 - 0andriy
我的目标只是理解内核。我正在创建一个模块,以便执行内核代码。我有一个用户空间程序,它在/dev中打开设备,因此该程序需要知道主要和次要设备号,以便使用mknode创建/dev文件。 - Bob5421
显示剩余2条评论
1个回答

2

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

"MKDEV(cd->major, baseminor)"创建设备号。因此,第一个设备号(dev_t)的次要编号为0。count(256)是可以进一步使用的连续次要编号。
如果您使用alloc_chrdev_region,还可以动态获取主要和次要编号。您只需传递一个dev_t结构到alloc_chrdev_region即可。它会动态分配主要和次要编号给您的设备。要在模块中获取主要和次要编号,可以使用
major = MAJOR(dev);
minor = MINOR(dev);

1
需要进行轻微更正:保留的次要编号范围将为0-255。 - Ian Abbott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接