Re: question on cdevsw_add mask/match

看板DFBSD_kernel作者時間21年前 (2005/03/23 10:32), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串6/6 (看更多)
:Matt - : :Thanks for the great explanation - this is starting to make sense. : :By specifying -1, isn't destroy_all_dev() (kern_conf.c:354) matching :against both the major and minor/unit numbers? It looks like :dev->si_udev is (major number << 8) | minor number (via makeudev() :kern_conf.c:216). match is the minor/unit number which gets compared :against all of si_udev because mask is 0xffffffff. Thus the conditional :on line 366 will never be equal because the mask includes the major :number in the comparison. Ah ha! Yes, you have indeed found a bug. :The question is how to specify mask/match for drivers wanting :/dev/driver%d like devices. If I'm understanding this, two possible :approaches would be : :1) continue to use the unit number for match but set mask to 0xff :2) continue to use -1 for the mask but make the match value be a :shift/OR or the major and unit numbers :... :Chuck Tuffli :Agilent Technologies The device (and thus the major number) are known separately so we do not want to require that they be incorporated in the mask/match code. This means that the destroy_all_dev() function needs to clear the bits associated with the major number (it matches the major based on matching the devsw already). For your own purposes you have a choice of using a mask of -1 or a mask of 0xff or a mask of whatever (keeping in mind that the major number eats bits 8-15). Some device drivers use just the upper 16 bits (giving 65535 units). Only a very few drivers use all 32-8 = 24 bits of minor number. Block devices that can have disklabels have to use all 24 bits, that's pretty much it. -Matt Matthew Dillon <dillon@backplane.com>
文章代碼(AID): #12GDKh00 (DFBSD_kernel)
文章代碼(AID): #12GDKh00 (DFBSD_kernel)