Linux kernel cdev_add()实际上做什么?在向内核注册设备方面

Linux kernel cdev_add()实际上做什么?在向内核注册设备方面,linux-kernel,kernel,linux-device-driver,Linux Kernel,Kernel,Linux Device Driver,cdev\u add()实际上做什么?我问的是用内核注册设备的条件 它是否在一些按主次号索引的映射中添加指向cdev结构的指针?当你说设备被添加/注册到内核时,这到底是怎么发生的。我想知道cdev_add在运行的内核中注册设备所采取的步骤。我们使用mknod命令为用户空间创建一个节点。甚至此命令也使用主编号和次编号进行映射。注册也有类似的功能吗?请参见此处的代码注释: cdev_add()-向系统中添加字符设备464* @p:设备465的cdev结构*@dev:第一个设备 此设备负责的编号466

cdev\u add()
实际上做什么?我问的是用内核注册设备的条件


它是否在一些按主次号索引的映射中添加指向cdev结构的指针?当你说设备被添加/注册到内核时,这到底是怎么发生的。我想知道cdev_add在运行的内核中注册设备所采取的步骤。我们使用
mknod
命令为用户空间创建一个节点。甚至此命令也使用主编号和次编号进行映射。注册也有类似的功能吗?

请参见此处的代码注释:

cdev_add()-向系统中添加字符设备464* @p:设备465的cdev结构*@dev:第一个设备 此设备负责的编号466*@count:该编号 与此467*对应的连续次编号的数量 device 468*469*cdev_add()将@p表示的设备添加到 系统,使其470*立即生效。一个否定的错误代码 失败时返回。471*/`

任何此类问题的直接答案都是阅读代码。莱纳斯就是这么说的

[编辑] cdev_add基本上将设备添加到系统中。本质上,这意味着在cdev_添加操作之后,您的新设备将通过
/sys/
文件系统获得可见性。该函数执行与此相关的所有必要的内部管理活动,特别是对设备的
kobj
引用将插入到其在对象层次结构中的位置。如果您想获得更多关于它的信息,我建议您阅读一下
/sysfs/
struct kboj

,您可以阅读。它有点旧,但主要思想是一样的。很难用几行文字解释像
cdev\u add()
这样的简单操作以及所有相关内容


我建议你阅读这本书和源代码。如果您在浏览源代码时遇到困难,可以使用一些标记系统,如etags+emacs或eclipse索引器。

cdev\U add在内核中注册字符设备。内核在cdev_映射下维护一个字符设备列表

static struct kobj_map *cdev_map;
kobj_映射基本上是一个探测数组,在本例中是字符设备列表:

struct kobj_map {
    struct probe {
        struct probe *next;
        dev_t dev;
        unsigned long range;
        struct module *owner;
        kobj_probe_t *get;
        int (*lock)(dev_t, void *);
        void *data;
    } *probes[255];
    struct mutex *lock;
};
您可以看到列表中的每个条目都有设备的主要编号和次要编号(dev_t dev)以及设备结构(以kobj_probe_t的形式,它是一个内核对象,在本例中代表cdev)。cdev_add将您的角色设备添加到探测列表:

int cdev_add(struct cdev *p, dev_t dev, unsigned count)
{
    ...
    error = kobj_map(cdev_map, dev, count, NULL,
             exact_match, exact_lock, p);
当您从进程在设备上执行打开操作时,内核将查找与设备文件名关联的inode(通过namei函数)。inode具有设备的主次号(dev_t i_rdev)和标志(imode),表明它是一个特殊(字符)设备。通过这个,它可以访问我上面解释的cdev列表,并为您的设备实例化cdev结构。从那里,它可以创建一个包含cdev文件操作的结构文件,并在进程的文件描述符表中安装一个文件描述符


这就是“注册”字符设备的实际含义,也是为什么需要这样做的原因。注册块设备与此类似。内核为已注册的GenDisk维护另一个列表。

谢谢您的回复!。你能详细说明你的答案吗。我试着浏览内核源代码。它有一些kobjmap结构。。。我们是否通过了dev_t和cdev结构……但我无法很好地理解源代码……您能给我解释一下这个映射过程的概述吗?我已经按照您的要求为答案添加了更多细节。我不知怎的错过了你的评论,直到发布了新的答案。