設備管理中有個結構體如下,不太明白是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到底是干什么用的?整個管理程序又什么鬼?
uj5u.com熱心網友回復:
上面寫錯了,應該是2^20-1才對,才能導致n>1轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/84913.html
標籤:內核源代碼研究區
上一篇:服用葉酸片有禁忌嗎,應該注意什么
