主設備號、次設備號

分配並註冊主次設備號
    設備號是在驅動module中分配並註冊的,也就是說,驅動module擁有這個設備號(我的理解),而/dev目錄下的設備文件是根據這個設備號創建的,因此,當訪問/dev目錄下的設備文件時,驅動module就知道,自己該出場服務了(當然是由內核通知)。
    在Linux內核看來,主設備號標識設備對應的驅動程序,告訴Linux內核使用哪一個驅動程序爲該設備(也就是/dev下的設備文件)服務;而次設備號則用來標識具體且唯一的某個設備。
    在內核中,用dev_t類型(其實就是一個32位的無符號整數)的變量來保存設備的主次設備號,其中高12位表示主設備號,低20位表示次設備號。
    設備獲得主次設備號有兩種方式:一種是手動給定一個32位數,並將它與設備聯繫起來(即用某個函數註冊);另一種是調用系統函數給設備動態分配一個主次設備號。

對於手動給定一個主次設備號,使用以下函數:
int register_chrdev_region(dev_t         first,
                           unsigned int -count,
                           char          *name)
    其中first是我們手動給定的設備號,count是所請求的連續設備號的個數,而name是和該設備號範圍關聯的設備名稱,它將出現在/proc/devices和sysfs中。
    比如,若first爲0x3FFFF0,count爲0x5,那麼該函數就會爲5個設備註冊設備號,分別是0x3FFFF0、 0x3FFFF1、 0x3FFFF2、 0x3FFFF3、 0x3FFFF4,其中0x3(高12位)爲這5個設備所共有的主設備號(也就是說這5個設備都使用同一個驅動程序)。而0xFFFF0、 0xFFFF1、 0xFFFF2、 0xFFFF3、 0xFFFF4就分別是這5個設備的次設備號了。需要注意的是,若count的值太大了,那麼所請求的設備號範圍可能會和下一個主設備號重疊。比如若first還是爲0x3FFFF0,而count爲0x11,那麼first+count=0x400001,也就是說爲最後兩個設備分配的主設備號已經不是0x3,而是0x4了!用這種方法註冊設備號有一個缺點,那就是若該驅動module被其他人廣泛使用,那麼無法保證註冊的設備號是其他人的Linux系統中未分配使用的設備號。


對於動態分配設備號,使用以下函數:
int alloc_chrdev_region(dev_t         *dev,
                        unsigned int -
firstminor,
                        unsigned int
-
count,
                        char          *name)
    該函數需要傳遞給它指定的第一個次設備號firstminor(一般爲0)和要分配的設備數count,以及設備名,調用該函數後自動分配得到的設備號保存在dev中。動態分配設備號可以避免手動指定設備號時帶來的缺點,但是它卻也有自己的缺點,那就是無法預先在/dev下創建設備節點,因爲動態分配設備號不能保證在每次加載驅動module時始終一致(其實若在兩次加載同一個驅動module之間並沒有加載其他的module,那麼自動分配的設備號還是一致的,因爲內核分配設備號並不是隨機的,但是書上說某些內核開發人員預示不久的將來會用隨機方式進行處理),不過,這個缺點可以避免,因爲在加載驅動module後,我們可以讀取/proc/devices文件以獲得Linux內核分配給該設備的主設備號。

與主次設備號相關的3個宏:
MAJOR(dev_t dev):根據設備號dev獲得主設備號;
MINOR(dev_t dev):根據設備號dev獲得次設備號;
MKDEV(int major, int minor):根據主設備號major和次設備號minor構建設備號。

 

http://hi.baidu.com/zengzhaonong/blog/item/8d7be4ed9597d84b79f0551c.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章