作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 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/
我是一名优秀的程序员,十分优秀!