- 論壇徽章:
- 0
|
當(dāng)使用動(dòng)態(tài)分配字符設(shè)備號(hào)的時(shí)候,無論是哪個(gè)函數(shù),最終都會(huì)調(diào)用__register_chrdev_region函數(shù),
當(dāng)major參數(shù)為0的時(shí)候,就表示由內(nèi)核動(dòng)態(tài)分配,那么下面的代碼:
static struct char_device_struct *
__register_chrdev_region(unsigned int major/*5*/, unsigned int baseminor/*0*/,
int minorct/*256*/, const char *name/*ville*/)
{
/*以上省略*/
/* temporary */
if (major == 0) {/*分配一個(gè)主設(shè)備號(hào)!*/
for (i = ARRAY_SIZE(chrdevs)-1; i > 0; i--) {
if (chrdevs[i] == NULL)
break;
}
if (i == 0) {
ret = -EBUSY;
goto out;
}
major = i;
ret = major;
}
/*以下省略*/
}
那么按照代碼的意思就是,在chrdevs數(shù)組中搜索直到有一個(gè)元素位NULL。
那么當(dāng)沒有元素等于NULL的時(shí)候,就會(huì)ret = -EBUSY;goto out;了!
這樣豈不是很不合理,因?yàn)閏hrdevs數(shù)組中是char_device_struct的指針,chrdevs是一個(gè)散列表,每一個(gè)數(shù)組元素都可以有一個(gè)
沖突鏈表,為什么不在前256個(gè)主設(shè)備號(hào)不能用的時(shí)候繼續(xù)尋找而直接退出呢?
在devices.txt中,0-11的字符設(shè)備主設(shè)備號(hào)已經(jīng)被分配,那么是不是采用動(dòng)態(tài)分配的形式,最多分配244次,就不能再分配了呢? |
|