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

2021-10-24 16:40:20 字數 1532 閱讀 4526

在linux作業系統下有3類主要的裝置檔案型別:塊裝置、字元裝置和網路裝置。這種分類方法可以將控制輸入/輸出裝置的驅動程式與其他作業系統軟體分離開來。字元裝置是指訪問時沒有快取的裝置。典型的字元裝置包括滑鼠、鍵盤、序列口等。

字元裝置與塊裝置的主要區別是:在對字元裝置發出讀/寫請求時,實際的硬體i/o一般緊接著發生。塊裝置則不然,它利用一塊系統記憶體作為緩衝區,若使用者程序對裝置的請求能滿足使用者的要求,就返回請求的資料;否則,就呼叫請求函式來進行實際的i/o操作。塊裝置主要是針對磁碟等慢速裝置設計的,以免耗費過多的cpu時間用來等待。網路裝置可以通過bsd套介面訪問資料。

一.主裝置號和次裝置號

主裝置號標識裝置對應的驅動程式;次裝置號由核心使用,用於正確確定裝置檔案所指的裝置。我們可以通過次裝置號獲得乙個指向核心裝置的直接指標,也可將次裝置號當作裝置本地陣列的索引,不管用哪種方式,除了知道次裝置號用來指向驅動程式所實現的裝置之外,核心本身基本上不關心關於次裝置號的任何其他訊息。

◎裝置編號的內部表達

核心用dev_t型別()來儲存裝置編號,dev_t是乙個32位的數,12位表示主裝置號,20位表示次裝置號。

在實際使用中,是通過中定義的巨集來轉換格式。

(dev_t)-->主裝置號、次裝置號       major(dev_t dev)     minor(dev_t dev)

主裝置號、次裝置號-->(dev_t)       mkdev(int major,int minor) 

◎分配和釋放裝置編號

建立乙個字元裝置之前,驅動程式首先要做的事情就是獲得裝置編號。其這主要函式在中宣告:

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等。

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

在linux作業系統下有3類主要的裝置檔案型別 塊裝置 字元裝置和網路裝置。這種分類方法可以將控制輸入 輸出裝置的驅動程式與其他作業系統軟體分離開來。字元裝置是指訪問時沒有快取的裝置。典型的字元裝置包括滑鼠 鍵盤 序列口等。字元裝置與塊裝置的主要區別是 在對字元裝置發出讀 寫請求時,實際的硬體i o...

塊裝置驅動

若塊裝置驅動程式也按以下字元裝置驅動程式的簡單思想來寫 1.硬碟 磁碟的讀寫其實非常快,慢在機械結構讀寫裝置的定位上面,從乙個 磁頭 的某 柱面 某 扇區 讀到資料後 步驟 r0 跳到另乙個 磁頭 的某 柱面 的某 扇區 去寫 步驟 w 接著再跳回原 磁頭 相同柱面的下乙個 扇區 去讀 步驟r1 慢...

裝置驅動 塊裝置驅動程式

塊裝置驅動程式提供對面向塊的裝置的訪問,這種裝置以隨機訪問的方式傳輸資料,並且資料總是具有固定大小的塊。典型的塊裝置是磁碟驅動器,也有其它型別的塊裝置。塊裝置和字元裝置有很大區別。比如塊裝置上可以掛載檔案系統,字元裝置不可以。這是隨機訪問帶來的優勢,因為檔案系統需要能按塊儲存資料,同時更需要能隨機讀...