gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:11:12 26 4
gpt4 key购买 nike

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

这是我在模块的初始化函数中所做的:

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

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

我读到我们不能设置这个次要号码。是内核给了我们这个数字。如果是这样,我怎么能在模块的初始化函数中知道它?

谢谢

最佳答案

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

关于linux-kernel - 我怎么知道 Linux 模块初始化上的未成年人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55632538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com