设备管理中有个结构体如下,不太明白是range这个变量是做什么用的?
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;
};
我看到kobj_map这个函数如下:
int kobj_map(struct kobj_map *domain, dev_t dev, unsigned long range,
     struct module *module, kobj_probe_t *probe,
     int (*lock)(dev_t, void *), void *data)
{
unsigned n = MAJOR(dev + range - 1) - MAJOR(dev) + 1;  //假设range>(2^12-1),导致n=2了
unsigned index = MAJOR(dev);
unsigned i;
struct probe *p; if (n > 255)
n = 255; p = kmalloc(sizeof(struct probe) * n, GFP_KERNEL);  //这里就创建2个probe结构体 if (p == NULL)
return -ENOMEM; for (i = 0; i < n; i++, p++) {
p->owner = module;
p->get = probe;
p->lock = lock;
p->dev = dev;
p->range = range;
p->data = data;
}
mutex_lock(domain->lock);
for (i = 0, p -= n; i < n; i++, p++, index++) {
struct probe **s = &domain->probes[index % 255];   //这里我不太明白,为什么index要++?
while (*s && (*s)->range < range)
s = &(*s)->next;
p->next = *s;
*s = p;
}
mutex_unlock(domain->lock);
return 0;
}
我不太明白在插入这个链表index要++,我的疑问是动态申请的所有probe结构体中,dev都是相同的,这里index++了,那不就会把dev插入到其他的链表上去了吗?我是这样想的probes[255]数组指针不是只有相同的主设备号才能在一个链表上吗?上面的index++了,就到下一个不同的主设备号的链表上去了,但是动态创建的probe的dev都是相同的,这不会有问题吗?还是我的理解错了?所以导致我不太明白这个range到底是干什么用的?整个管理过程又什么鬼?