那kbj_map中的void *data 为什么也赋值为chardev
时间: 2024-03-05 07:54:04 浏览: 26
我不了解 `kbj_map`,不过根据您的描述,可能是出现了一些概念混淆。
在 Linux 内核中,字符设备对象用 `struct cdev` 结构体来表示。每个 `struct cdev` 结构体都包含了字符设备的设备号、字符设备操作函数、等待队列、设备链表指针等信息。
而 `void *data` 是一个指向未知类型数据的指针,它并不是专门用于表示字符设备对象的指针。因此,将 `void *data` 赋值为 `chardev` 可能会引起一些问题,因为 `chardev` 不是一个通用的数据类型,而是一个自定义的数据类型。
如果您想将字符设备对象保存在一个哈希表或映射表中,可以考虑使用 `struct cdev` 结构体的指针作为值,而不是将 `void *data` 直接赋值为 `chardev`。例如:
```c
#include <linux/cdev.h>
#define DEVICE_NUM 2
static struct cdev cdevs[DEVICE_NUM];
static struct kobj_map *map;
int init_module(void)
{
int i;
// 初始化字符设备对象
for (i = 0; i < DEVICE_NUM; i++) {
cdev_init(&cdevs[i], &fops);
cdevs[i].owner = THIS_MODULE;
}
// 注册字符设备对象
if (cdev_add(&cdevs[0], MKDEV(0, 0), 1) < 0)
goto err;
if (cdev_add(&cdevs[1], MKDEV(0, 1), 1) < 0)
goto err;
// 创建映射表
map = kobj_map_init_empty();
if (!map)
goto err;
// 将字符设备对象添加到映射表中
if (kobj_map_add(map, MKDEV(0, 0), &cdevs[0]))
goto err;
if (kobj_map_add(map, MKDEV(0, 1), &cdevs[1]))
goto err;
return 0;
err:
// 错误处理
return -1;
}
void cleanup_module(void)
{
// 从映射表中删除字符设备对象
kobj_map_remove(map, MKDEV(0, 0));
kobj_map_remove(map, MKDEV(0, 1));
// 销毁映射表
kobj_map_release(map);
// 删除字符设备对象
cdev_del(&cdevs[0]);
cdev_del(&cdevs[1]);
}
```
上面的代码使用 `kobj_map` 数据结构来实现设备号和字符设备对象之间的映射关系,其中每个键值对的值都是 `struct cdev` 结构体的指针。映射表的创建和销毁在模块初始化和清理函数中完成,通过 `kobj_map_add()` 和 `kobj_map_remove()` 函数向映射表中添加和删除键值对。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![PcbLib](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![lib](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![m](https://img-home.csdnimg.cn/images/20210720083646.png)