1. 程式人生 > >字元裝置驅動與塊裝置驅動、網路裝置驅動的區別

字元裝置驅動與塊裝置驅動、網路裝置驅動的區別

在Linux作業系統下有3類主要的裝置檔案型別:塊裝置、字元裝置和網路裝置。這種分類方法可以將控制輸入/輸出裝置的驅動程式與其他作業系統軟體分離開來。字元裝置是指存取時沒有快取的裝置。典型的字元裝置包括滑鼠、鍵盤、序列口等。
字元裝置與塊裝置的主要區別是:在對字元裝置發出讀/寫請求時,實際的硬體I/O一般緊接著發生。塊裝置則不然,它利用一塊系統記憶體作為緩衝區,若使用者程序對裝置的請求能滿足使用者的要求,就返回請求的資料;否則,就呼叫請求函式來進行實際的I/O操作塊裝置主要是針對磁碟等慢速裝置設計的,以免耗費過多的CPU時間用來等待網路裝置可以通過BSD套介面訪問資料
一.主裝置號和次裝置號
主裝置號標識裝置對應的驅動程式;次裝置號由核心使用,用於正確確定裝置檔案所指的裝置。我們可以通過次裝置號獲得一個指向核心裝置的直接指標,也可將次裝置號當作裝置本地陣列的索引,不管用哪種方式,除了知道次裝置號用來指向驅動程式所實現的裝置之外,核心本身基本上不關心關於次裝置號的任何其他訊息。

◎裝置編號的內部表達
核心用dev_t型別(<linux/types.h>)來儲存裝置編號,dev_t是一個32位的數,12位表示主裝置號,20位表示次裝置號。
在實際使用中,是通過<linux/kdev_t.h>中定義的巨集來轉換格式。
 (dev_t)-->主裝置號、次裝置號       MAJOR(dev_t dev)     MINOR(dev_t dev)
 主裝置號、次裝置號-->(dev_t)       MKDEV(int major,int minor) 
◎分配和釋放裝置編號
建立一個字元裝置之前,驅動程式首先要做的事情就是獲得裝置編號。其這主要函式在<linux/fs.h>中宣告:

int register_chrdev_region(dev_t first, unsigned int count,char *name);   //指定裝置編號
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor,unsigned int count, char *name);  //動態生成裝置編號
void unregister_chrdev_region(dev_t first, unsigned int count);      //釋放裝置編號 
分配之裝置號的最佳方式是:預設採用動態分配,同時保留在載入甚至是編譯時指定主裝置號的餘地。

◎動態分配主裝置號

    某些主裝置號已經靜態地分配給了大部分公用裝置。在核心原始碼樹的Documentation/device.txt......

可以講字元裝置和塊裝置歸為一類,它們都是可以順序/隨機地進行讀取和儲存的單元,二者驅動主要在於塊裝置需要具體的burst實現,對訪問也有一定的邊界要求。其他的沒有什麼不同。
網路裝置是特殊裝置的驅動,它負責接收和傳送幀資料,可能是物理幀,也可能是ip資料包,這些特性都有網路驅動決定。它並不存在於/dev下面,所以與一般的裝置不同。網路裝置是一個net_device結構,並通過register_netdev註冊到系統裡,最後通過ifconfig -a的命令就能看到。
不論是什麼裝置,裝置級的資料傳輸都是基本類似的,核心裡的資料表示只是一部分,更重要的是匯流排的訪問,例如序列spi,i2c,並行dma等。