*/ int cdev_add( struct cdev *p, dev_t dev, unsigned count) { int error; p->dev = dev; p->count = count; error = kobj_map (cdev_map, dev, count, NULL, exact_match, exact_lock, p); if (error) return error; kobject_get(p->kobj.parent); return 0; } kobj_map()函数:用...
if ((cdev = cdev_alloc()) == NULL) { printk(DEVICE_NAME "Failed to alloc cdev\n"); return -1; } cdev->owner = THIS_MODULE; cdev->ops = &led_ops; /* 将cdev加入cdev_map,这样才能通过设备号找到cdev */ if (cdev_add(cdev, dev, LED_NUM + 1) < 0) { printk(DEVICE_NAME "F...
但是分析misc_register()函数,发现只调用了device_add()函数,并没有调用cdev_add(),那么自己定义的file_operations是如何和cdev关联起来的呢? 其实misc.c中用了另外一套思路,但是原理是一样的。 创建cdev_map 在misc_init()中, 通过register_c...
cdev_alloc和cdev_init都比较简单,这里就不说了。在cdev_add中有一个很重要的函数kobj_map。 int cdev_add(struct cdev *p, dev_t dev, unsigned count) { p->dev = dev; p->count = count; return kobj_map(cdev_map, dev, count, NULL, exact_match, exact_lock, p); } struct kobj_map { ...
1、我们通常会在内核驱动中实现一个file_operations结构体,然后分配主次设备号,调用cdev_add函数进行注册。 2、从/proc/devices下面找到注册的设备的主次设备号,在用mknod /dev/char_dev c major minor命令行创建设备节点。 3、在用户空间open /dev/char_dev这个设备,然后进行各种操作。
>2 添加cdev设备。这里首先介绍kobj_map结构体 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; 指向struct cdev对象 } *probes[255]; ...
设备号和设备的操作方法集合相关联,然后将该 cdev 结构对象添加到内核的 cdev_map 散列表中。下面我们逐步来实现这一过程,首先就是在驱动中注册设备号,代码如下(完整的代码请参见“”)。 在模块的初始化函数中,首先在代码第 38 行使用 MKDEV 宏将主设备号和次设备号合并成一个设备号。
int cdev_add(struct cdev *p, dev_t dev, unsigned count) { p->dev = dev; p->count = count; return kobj_map(cdev_map, dev, count, NULL, exact_match, exact_lock, p); } struct kobj_map { struct probe { struct probe *next; ...
这个cdev_map是一个struct kobj_map类型的指针,其中包含着一个struct probe*类型、大小为255的数组,数组的每个元素指向的一个probe结构封装了一个设备号和相应的设备对象(这里就是cdev),下图中体现两种常见的对设备号和cdev管理的方式,其一是一个cdev对象对应这一个/多个设备号的情况, 在cdev_map中, 一个probes...
创建misdevice时,仅通过device_add()函数注册,自定义file_operations与cdev的关联是通过在misdevice中实现关联完成的。miscdevice通过将主设备号为0的cdev注册至cdev_map,并绑定默认的misc_open函数,实现与sys文件系统的关联。misdevice通过注册过程实现了device、cdev与自定义file_operations的关联。对于...