設(shè)備分為三大類:字符設(shè)備,塊設(shè)備和網(wǎng)絡(luò)設(shè)備。內(nèi)核針對(duì)每一類設(shè)備都提供了對(duì)應(yīng)驅(qū)動(dòng)模型架構(gòu),包括基本的內(nèi)核設(shè)施和文件系統(tǒng)接口。
字符設(shè)備:在傳送過程中以字符為單位,一個(gè)字Linux中設(shè)備驅(qū)動(dòng)的分類
從上圖可以看到Linux系統(tǒng)將各異的設(shè)備分為三大類:字符設(shè)備,塊設(shè)備和網(wǎng)絡(luò)設(shè)備。內(nèi)核針對(duì)每一類設(shè)備都提供了對(duì)應(yīng)驅(qū)動(dòng)模型架構(gòu),包括基本的內(nèi)核設(shè)施和文件系統(tǒng)接口。
字符設(shè)備:在傳送過程中以字符為單位,一個(gè)字節(jié)一個(gè)字節(jié)的讀寫,不能隨機(jī)的讀寫數(shù)據(jù),因?yàn)檫@類設(shè)備讀寫速度比較緩慢(因而其內(nèi)核設(shè)施中不提供緩存機(jī)制),常見的字符設(shè)備有鍵盤,鼠標(biāo)已打印機(jī)設(shè)備等。
塊設(shè)備:是指可以從任意位置讀取數(shù)據(jù)的設(shè)備,對(duì)這種設(shè)備讀寫是按塊為單位讀寫的。它使用緩存區(qū)來暫存數(shù)據(jù),等待條件成熟后,會(huì)一并將數(shù)據(jù)寫入到設(shè)備或者從設(shè)備一次性讀出到緩沖區(qū)。比較U盤,磁盤,SD卡等。
網(wǎng)絡(luò)設(shè)備:網(wǎng)絡(luò)設(shè)備不同于字符設(shè)備和塊設(shè)備,它是面向報(bào)文的。同時(shí)在/dev目錄下沒有設(shè)備節(jié)點(diǎn)這樣一說,在應(yīng)用層是用戶是通過API的socket函數(shù)來使用網(wǎng)絡(luò)設(shè)備的。比如網(wǎng)卡等。
設(shè)備號(hào)的構(gòu)成
● 主設(shè)備號(hào)與次設(shè)備號(hào)
關(guān)于設(shè)備號(hào),我們先通過如下的圖來了解一下
從上圖可以看出,c代表的是字符設(shè)備,d代碼的是塊設(shè)備。
對(duì)于紅色區(qū)域來說,1是主設(shè)備號(hào),11是次設(shè)備號(hào)。
對(duì)于綠色區(qū)域來說,7是主設(shè)備號(hào),0-7代表是次設(shè)備號(hào)。
主設(shè)備號(hào)用來標(biāo)識(shí)對(duì)于的設(shè)備驅(qū)動(dòng)程序,而次設(shè)備號(hào)則由驅(qū)動(dòng)程序使用,用來標(biāo)識(shí)它所管理的若干同類設(shè)備。
●設(shè)備號(hào)的表示
在linux系統(tǒng)中,設(shè)備號(hào)用dev_t表示。這是個(gè)32位的無符號(hào)整數(shù)。
在內(nèi)核中,dev_t的低20位用來表示次設(shè)備號(hào),高12位用來表示主設(shè)備號(hào)。隨著Linux系統(tǒng)的演變,上述的主次設(shè)備號(hào)的分發(fā)可能在將來會(huì)發(fā)生變化,所以設(shè)備驅(qū)動(dòng)程序開發(fā)者應(yīng)該避免直接使用主次設(shè)備號(hào)所占的位寬來獲得對(duì)于的主設(shè)備號(hào)或次設(shè)備號(hào)。為了保證以后主次設(shè)備號(hào)所占的位數(shù)發(fā)生變化之后,驅(qū)動(dòng)程序依然可以正常工作,內(nèi)核提供了如下了幾個(gè)宏來操作設(shè)備號(hào)。
其中MAJOR宏用來從一個(gè)dev_t類型的設(shè)備號(hào)中提取出主設(shè)備號(hào),MINOR宏從來從一個(gè)dev_t類型的設(shè)備號(hào)中提取出此設(shè)備號(hào)。MKDEV則是將主設(shè)備號(hào)ma和次設(shè)備號(hào)mi合成一個(gè)dev_t類型的設(shè)備號(hào)。
假設(shè)在內(nèi)核版本之后對(duì)主次設(shè)備號(hào)所占的位數(shù)發(fā)生了變化,MINORBITS修改為18位,只要驅(qū)動(dòng)是使用MAJOR和MINOR宏來操作設(shè)備號(hào),就不需要修改驅(qū)動(dòng)代碼也可以在新內(nèi)核中使用。
設(shè)備號(hào)的分配
在內(nèi)核源碼中,設(shè)備號(hào)的分配主要有兩個(gè)函數(shù):
●靜態(tài)分配設(shè)備號(hào)
該函數(shù)是用來在知道主設(shè)備號(hào)的前提下使用,第一個(gè)參數(shù)form表示一個(gè)設(shè)備號(hào),第二個(gè)參數(shù)count表示次設(shè)備的個(gè)數(shù),也就是當(dāng)前驅(qū)動(dòng)程序所管理的同類設(shè)備的個(gè)數(shù),第三個(gè)參數(shù)name表示設(shè)備或者驅(qū)動(dòng)的名稱。成功返回0,失敗返回負(fù)數(shù)。
比如內(nèi)核代碼中使用register_chrdev_region申請(qǐng)?jiān)O(shè)備號(hào)示例:
以上代碼申請(qǐng)了主設(shè)備號(hào)為13,總共存在1024個(gè)次設(shè)備,設(shè)備的名字為input。
●動(dòng)態(tài)分配設(shè)備號(hào)
該函數(shù)有系統(tǒng)動(dòng)態(tài)的分配設(shè)備號(hào),是在主設(shè)備號(hào)不知情的情況下,讓系統(tǒng)給分配設(shè)備號(hào)。第一個(gè)參數(shù)dev表示是輸出參數(shù),也就是設(shè)備號(hào),第二個(gè)參數(shù)baseminor表示第一個(gè)次設(shè)備號(hào)編號(hào),第三個(gè)參數(shù)count表示次設(shè)備號(hào)的個(gè)數(shù),第四個(gè)參數(shù)name也就是設(shè)備或者驅(qū)動(dòng)的名稱。
內(nèi)核中使用alloc_chrdev_region的示例:
上述示例代碼是通過alloc_chrdev_region函數(shù)申請(qǐng)?jiān)O(shè)備號(hào),設(shè)備的個(gè)數(shù)為16個(gè),設(shè)備的名稱為rtc設(shè)備。
設(shè)備號(hào)釋放
在驅(qū)動(dòng)程序不使用的時(shí)候需要釋放設(shè)備號(hào),因?yàn)樵O(shè)備號(hào)也是系統(tǒng)的資源,不用的使用需要及時(shí)釋放資源。已供其他設(shè)備使用。
使用該函數(shù)可以使用申請(qǐng)的設(shè)備號(hào),第一個(gè)參數(shù)from表示要釋放的設(shè)備號(hào),第二個(gè)參數(shù)count表示要釋放的個(gè)數(shù)。
內(nèi)核使用unregister_chrdev_region的示例:
從上面代碼可知,如果調(diào)用unregister_chrdev_region就會(huì)從系統(tǒng)中釋放主設(shè)備號(hào)13的設(shè)備。
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1382瀏覽量
40430 -
Linux
+關(guān)注
關(guān)注
87文章
11345瀏覽量
210408 -
網(wǎng)絡(luò)設(shè)備
+關(guān)注
關(guān)注
0文章
318瀏覽量
29767
原文標(biāo)題:Linux字符設(shè)備學(xué)習(xí)之設(shè)備號(hào)的構(gòu)成、分配、釋放
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
關(guān)于Linux內(nèi)存管理的詳細(xì)介紹
如何在Ubuntu Linux上釋放/boot分區(qū)中的空間
linux的內(nèi)存釋放操作
Linux內(nèi)存系統(tǒng): Linux 內(nèi)存分配算法
Linux操作系統(tǒng)具體構(gòu)成
LINUX內(nèi)核中的內(nèi)存是如何進(jìn)行分配的
Linux MTD下獲取Nand flash 各個(gè)參數(shù)的過程的詳細(xì)解析
![<b class='flag-5'>Linux</b> MTD下獲取Nand flash 各個(gè)參數(shù)的過程的<b class='flag-5'>詳細(xì)</b><b class='flag-5'>解析</b>](https://file.elecfans.com/web2/M00/49/37/poYBAGKhwI6AFktIAAA0Xm4N1Sk288.png)
嵌入式Linux主設(shè)備號(hào)和次設(shè)備號(hào)的獲取
![嵌入式<b class='flag-5'>Linux</b>主<b class='flag-5'>設(shè)備</b><b class='flag-5'>號(hào)</b>和次<b class='flag-5'>設(shè)備</b><b class='flag-5'>號(hào)</b>的獲取](https://file.elecfans.com/web1/M00/51/5F/pIYBAFsFMmyAXkqEAAAvS__A5XM700.png)
Linux DMA Engine框架的介紹
學(xué)會(huì)linux驅(qū)動(dòng)程序的步驟
Linux DMA內(nèi)置設(shè)備驅(qū)動(dòng)程序的詳細(xì)資料說明
![<b class='flag-5'>Linux</b> DMA內(nèi)置<b class='flag-5'>設(shè)備</b>驅(qū)動(dòng)程序的<b class='flag-5'>詳細(xì)</b>資料說明](https://file.elecfans.com/web1/M00/8D/EE/o4YBAFyv4QqAYb-UAACAeomzHIA595.png)
Linux內(nèi)核之塊分配器
Linux新字符設(shè)備驅(qū)動(dòng)開發(fā)方式
![<b class='flag-5'>Linux</b>新字符<b class='flag-5'>設(shè)備</b>驅(qū)動(dòng)開發(fā)方式](https://file1.elecfans.com/web2/M00/82/09/wKgZomQ4zwSAd2L8AAO46CHaicU147.jpg)
虹科干貨 |?多設(shè)備協(xié)同無憂:Linux環(huán)境下PCAN固定設(shè)備ID/通道分配指南
![虹科干貨 |?多<b class='flag-5'>設(shè)備</b>協(xié)同無憂:<b class='flag-5'>Linux</b>環(huán)境下PCAN固定<b class='flag-5'>設(shè)備</b>ID/通道<b class='flag-5'>分配</b>指南](https://file1.elecfans.com/web2/M00/ED/91/wKgaomZn9jyADoptAANnpbY9Xvo928.png)
Linux內(nèi)核中的頁面分配機(jī)制
![<b class='flag-5'>Linux</b>內(nèi)核中的頁面<b class='flag-5'>分配</b>機(jī)制](https://file1.elecfans.com/web2/M00/01/F5/wKgaomazJ8-AL_POAAAOtG0PZQM563.png)
評(píng)論