設備分為三大類:字符設備,塊設備和網絡設備。內核針對每一類設備都提供了對應驅動模型架構,包括基本的內核設施和文件系統接口。
字符設備:在傳送過程中以字符為單位,一個字Linux中設備驅動的分類
從上圖可以看到Linux系統將各異的設備分為三大類:字符設備,塊設備和網絡設備。內核針對每一類設備都提供了對應驅動模型架構,包括基本的內核設施和文件系統接口。
字符設備:在傳送過程中以字符為單位,一個字節一個字節的讀寫,不能隨機的讀寫數據,因為這類設備讀寫速度比較緩慢(因而其內核設施中不提供緩存機制),常見的字符設備有鍵盤,鼠標已打印機設備等。
塊設備:是指可以從任意位置讀取數據的設備,對這種設備讀寫是按塊為單位讀寫的。它使用緩存區來暫存數據,等待條件成熟后,會一并將數據寫入到設備或者從設備一次性讀出到緩沖區。比較U盤,磁盤,SD卡等。
網絡設備:網絡設備不同于字符設備和塊設備,它是面向報文的。同時在/dev目錄下沒有設備節點這樣一說,在應用層是用戶是通過API的socket函數來使用網絡設備的。比如網卡等。
設備號的構成
● 主設備號與次設備號
關于設備號,我們先通過如下的圖來了解一下
從上圖可以看出,c代表的是字符設備,d代碼的是塊設備。
對于紅色區域來說,1是主設備號,11是次設備號。
對于綠色區域來說,7是主設備號,0-7代表是次設備號。
主設備號用來標識對于的設備驅動程序,而次設備號則由驅動程序使用,用來標識它所管理的若干同類設備。
●設備號的表示
在linux系統中,設備號用dev_t表示。這是個32位的無符號整數。
在內核中,dev_t的低20位用來表示次設備號,高12位用來表示主設備號。隨著Linux系統的演變,上述的主次設備號的分發可能在將來會發生變化,所以設備驅動程序開發者應該避免直接使用主次設備號所占的位寬來獲得對于的主設備號或次設備號。為了保證以后主次設備號所占的位數發生變化之后,驅動程序依然可以正常工作,內核提供了如下了幾個宏來操作設備號。
其中MAJOR宏用來從一個dev_t類型的設備號中提取出主設備號,MINOR宏從來從一個dev_t類型的設備號中提取出此設備號。MKDEV則是將主設備號ma和次設備號mi合成一個dev_t類型的設備號。
假設在內核版本之后對主次設備號所占的位數發生了變化,MINORBITS修改為18位,只要驅動是使用MAJOR和MINOR宏來操作設備號,就不需要修改驅動代碼也可以在新內核中使用。
設備號的分配
在內核源碼中,設備號的分配主要有兩個函數:
●靜態分配設備號
該函數是用來在知道主設備號的前提下使用,第一個參數form表示一個設備號,第二個參數count表示次設備的個數,也就是當前驅動程序所管理的同類設備的個數,第三個參數name表示設備或者驅動的名稱。成功返回0,失敗返回負數。
比如內核代碼中使用register_chrdev_region申請設備號示例:
以上代碼申請了主設備號為13,總共存在1024個次設備,設備的名字為input。
●動態分配設備號
該函數有系統動態的分配設備號,是在主設備號不知情的情況下,讓系統給分配設備號。第一個參數dev表示是輸出參數,也就是設備號,第二個參數baseminor表示第一個次設備號編號,第三個參數count表示次設備號的個數,第四個參數name也就是設備或者驅動的名稱。
內核中使用alloc_chrdev_region的示例:
上述示例代碼是通過alloc_chrdev_region函數申請設備號,設備的個數為16個,設備的名稱為rtc設備。
設備號釋放
在驅動程序不使用的時候需要釋放設備號,因為設備號也是系統的資源,不用的使用需要及時釋放資源。已供其他設備使用。
使用該函數可以使用申請的設備號,第一個參數from表示要釋放的設備號,第二個參數count表示要釋放的個數。
內核使用unregister_chrdev_region的示例:
從上面代碼可知,如果調用unregister_chrdev_region就會從系統中釋放主設備號13的設備。
-
內核
+關注
關注
3文章
1410瀏覽量
41096 -
Linux
+關注
關注
87文章
11460瀏覽量
212791 -
網絡設備
+關注
關注
0文章
325瀏覽量
30324
原文標題:Linux字符設備學習之設備號的構成、分配、釋放
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
關于Linux內存管理的詳細介紹
如何在Ubuntu Linux上釋放/boot分區中的空間
linux的內存釋放操作
Linux內存系統: Linux 內存分配算法
Linux操作系統具體構成
LINUX內核中的內存是如何進行分配的
Linux DMA Engine框架的介紹
Linux DMA內置設備驅動程序的詳細資料說明

虹科干貨 |?多設備協同無憂:Linux環境下PCAN固定設備ID/通道分配指南

Linux內核中的頁面分配機制

評論