cdev_add

初始化 cdev 后,需要把它添加到系统中去。为此可以调用 cdev_add()函数。传入cdev 结构的指针,起始设备编号,以及设备编号范围。

函数首先将分配的设备号与设备数目保存进cdev结构体中。然后再讲cdev结构体记录在一个 kobj_map 结构的 cdev_map 变量中。

 1 /**
 2  * cdev_add() - add a char device to the system
 3  * @p: the cdev structure for the device
 4  * @dev: the first device number for which this device is responsible
 5  * @count: the number of consecutive minor numbers corresponding to this
 6  *         device
 7  *
 8  * cdev_add() adds the device represented by @p to the system, making it
 9  * live immediately.  A negative error code is returned on failure.
10  */
11 int cdev_add(struct cdev *p, dev_t dev, unsigned count)
12 {
13     p->dev = dev;
14     p->count = count;
15     return kobj_map(cdev_map, dev, count, NULL, exact_match, exact_lock, p);
16 }

内核中所有都字符设备都会记录在一个 kobj_map 结构的 cdev_map 变量中。这个结构的变量中包含一个散列表用来快速存取所有的对象。kobj_map() 函数就是用来把字符设备编号和 cdev 结构变量一起保存到 cdev_map 这个散列表里。当后续要打开一个字符设备文件时,通过调用 kobj_lookup() 函数,根据设备编号就可以找到 cdev 结构变量,从而取出其中的 ops 字段。

kobj_map函数中哈希表的实现原理和前面注册分配设备号中的几乎完全一样,通过要加入系统的设备的主设备号major(major=MAJOR(dev))来获得probes数组的索引值i(i = major % 255),然后把一个类型为struct probe的节点对象加入到probes[i]所管理的链表中,如图2-6所示。其中struct probe所在的矩形块中的深色部分是我们重点关注的内容,记录了当前正在加入系统的字符设备对象的有关信息。其中,dev是它的设备号,range是从次设备号开始连续的设备数量,data是一void *变量,指向当前正要加入系统的设备对象指针p。图2-6展示了两个满足主设备号major % 255 = 2的字符设备通过调用cdev_add之后,cdev_map所展现出来的数据结构状态。

所以,简单地说,设备驱动程序通过调用cdev_add把它所管理的设备对象的指针嵌入到一个类型为struct probe的节点之中,然后再把该节点加入到cdev_map所实现的哈希链表中。对系统而言,当设备驱动程序成功调用了cdev_add之后,就意味着一个字符设备对象已经加入到了系统,在需要的时候,系统就可以找到它。对用户态的程序而言,cdev_add调用之后,就已经可以通过文件系统的接口呼叫到我们的驱动程序。

 1 static struct kobj_map *cdev_map;
 2 typedef struct kobject *kobj_probe_t(dev_t, int *, void *);
 3 struct kobj_map {
 4     
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: cdev_add函数是Linux内核中的一个函数,用于向系统注册字符设备。其函数原型如下: ```c int cdev_add(struct cdev *p, dev_t dev, unsigned int count); ``` 函数参数的含义如下: 1. `struct cdev *p`:要注册的字符设备的cdev结构体指针。 2. `dev_t dev`:设备号,表示设备的主设备号和次设备号。可以使用`MKDEV()`宏将主设备号和次设备号组合成设备号。 3. `unsigned int count`:设备的次设备号数量。如果只有一个设备,则该参数为1。 函数返回值为0表示成功,其他值表示失败。 ### 回答2: cdev_add函数是在Linux内核中用于向系统注册字符设备的函数。该函数有两个参数: 1. struct cdev *cdev:表示要注册的字符设备结构体指针。这个结构体表示了一个字符设备,并包含了字符设备的各种属性和操作方法。 2. dev_t dev:表示要分配给设备的设备号。设备号由主设备号和次设备号组成,用于唯一标识一个设备。主设备号用于确定设备所属驱动程序,次设备号用于区分同一驱动程序下的不同设备。 通过调用cdev_add函数,可以将字符设备结构体与设备号关联起来,并将其注册到系统中。注册后,系统就可以通过设备号来识别并操作该设备。 同时,cdev_add函数还会负责将字符设备添加到系统的字符设备链表中,并完成相关的初始化工作,如为设备分配空间、初始化字符设备结构体等。这样,系统就可以通过字符设备链表来管理所有已注册的字符设备,并提供相应的操作接口。 总结起来,cdev_add函数的参数含义是:要注册的字符设备结构体指针和设备号,通过这个函数将字符设备注册到系统中,并完成相关的初始化工作,以便系统可以对该设备进行操作。 ### 回答3: cdev_add函数是Linux内核中的一个函数,主要用于向系统注册一个字符设备驱动,并将该驱动关联到一个主设备号和次设备号。 cdev_add函数的参数含义如下: 1. struct cdev *p:指向一个表示字符设备的struct cdev结构体的指针。该结构体是字符设备驱动的核心数据结构,其中包含了字符设备驱动的相关信息。 2. dev_t dev:表示设备号的数据类型。dev_t数据类型是一个32位整数,其中高12位表示主设备号,低20位表示次设备号。dev参数即表示这个字符设备驱动的设备号。 3. unsigned int count:表示连续的设备号的数量,即表示连续的次设备号的数量。count参数用于指定驱动所支持的设备的数量。 cdev_add函数的调用过程会完成如下几个步骤: 1. 首先,cdev_add函数会将dev参数中的主设备号作为参数调用了cdev_alloc函数,用于创建并初始化一个struct cdev结构体对象。 2. 然后,cdev_add函数会将count参数中指定的数量的次设备号分配给字符设备驱动,同时将这些次设备号与先前创建的struct cdev结构体对象进行关联。 3. 最后,cdev_add函数会将这个字符设备的struct cdev结构体对象添加到内核中,使之成为字符设备子系统中的一个有效的字符设备。 总的来说,cdev_add函数的作用是将一个字符设备驱动注册到系统中,并为该驱动分配主设备号和次设备号,使之能够正常操作设备。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值