裝置號的靜態申請與動態分配

2021-06-21 07:51:55 字數 1749 閱讀 4268

字元型別驅動

裝置號是在驅動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構建裝置號。

字元裝置號申請與註冊

了解了雜項裝置的註冊後,還需要學習字元裝置申請和註冊 直接上 吧 include linux啟動相關 include 檔案系統相關 include 模組相關 include 裝置相關 include 裝置型別相關 include 模組傳參相關 include 檔案屬性相關 include inclu...

字元裝置驅動 靜態 動態申請裝置號

靜態裝置號申請 申請裝置號,from 要申請的裝置號,count 申請幾個裝置,name 裝置名字 int register chrdev region dev t from,unsigned count,const char name 登出裝置號,from 要登出的裝置號,count 登出幾個裝置...

靜態分配和動態分配

記憶體的靜態分配和動態分配的區別主要是兩個 一是時間不同。靜態分配發生在程式編譯和連線的時候。動態分配則發生在程式調入和執行的時候。二是空間不同。堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式 靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由函式malloc進行分配...