close
Device Numbers

郭慶賢

2005/04/09

rene@broadband.ce.ncu.edu.tw

Device Numbers
File Operations
DEV_FS

char device的特性是其傳輸資料的方式是一次只傳一個位元組的資料,而且是次序性(sequential)的而非隨機的(random),字元式裝置本身通常只是資料傳輸通道,此類的裝置如終端機,鍵盤,滑鼠等。char device的存取是透過檔案系統中名字,這些名字有別於一般的檔案名稱,他們被稱為特殊檔案或裝置檔案,他們也是檔案系統的一個節點(node),傳統上是放在 /dev 這個子目錄下,若在這個子目錄下鍵入 'ls -l' 的指令,char device可由第一行的 'c' 字母來辨認,同樣的,在這個指令下,可看到由逗號分隔的兩個數字,這兩個數字分別代表著個別裝置的major number和minor number ,major number主要用來辨別某一裝置所對應的驅動程式,而minor number是代表相同major number下(用相同驅動程式)的不同裝置,kernel在開啟時會用到major,然後分配執行給合適的驅動程式,事實上,核心根本用不到minor number,它只單純地將minor number傳給相對應的驅動程式,驅動程式收到kernel傳來的minor number後,便可以據此知道該驅動那一個裝置,同一驅動程式控制多個裝置是常有的事,minor number可讓驅動程式區別各個裝置。

新增一個char device driver到系統中只要註冊一個major number到系統中即可,我們必須使用定義於<linux/fs.h>中的

int register_chardev(unsigned int major, const char *name, struct file_operations *fops);

如果回傳值是負的,則代表有錯誤,如果是0或是正數代表成功,name是裝置的名稱,而且他將會出現在/proc/devices中,fops is the pointer to an array of function pointers, used to invoke driver's entry points. fop用來喚起裝置驅動程式的進入點。

Char_Dev.c

 

compiler並且load module

 

/proc/devices內容

 

major number在Kernel 2.0只有支援到128個device,2.2之後就支援到256個device,而minor number只有使用8個bit,所以只能到127,minor number主要是給device自己用的,kernel 2.5會支援到256以上(16bit以上)。

一但driver和系統註冊後,系統最主要就是利用這個major number和driver溝通,而且kernel會去尋找並且會由file_operations使用適當的function,所以 file_operations這個structure必須被宣告成global variable,再來就是創建一個device node,你可以使用mknod這個指令,如

mknod /dev/default / c 254 0

mknod

移除char device請使用

int unregister_chardev(unsigned int major, const char *name)

當自系統中移除字元式驅動程式,卻未能將主碼一併註銷時,系統會發生嚴重錯誤,因此當謹慎 major 參數和 name 參數的使用。傳統上,UNIX 會把裝置代碼宣告成 dev_t,而 Linux 則將其宣告成 kdev_t。驅動程式並不理會裝置名稱,它在乎的是裝置代碼。

 

major number的動態分配

如果major number事先就定好,那麼很容易就造成衝突,所以我們必須使用動態分配,動態分配只要將major number設成0就可以了,如果回傳值是負值則代表錯誤,如果是正值則表示動態取得的major number。動態分配的缺點是load的時候才知道major number。

load module的結果


arrow
arrow
    全站熱搜

    Bluelove1968 發表在 痞客邦 留言(0) 人氣()