linux中三種驅(qū)動設備
linux系統(tǒng)將設備分為3類:字符設備箱蝠、塊設備、網(wǎng)絡設備吃粒。
字符設備
字符設備是能夠像字節(jié)流(類似文件)一樣被訪問的設備巧娱,有字符設備驅(qū)動程序來實現(xiàn)這種特性。字符設備驅(qū)動程序通常至少要實現(xiàn)open逾滥、close峰档、read、write系統(tǒng)調(diào)用寨昙。字符設備可以通過文件系統(tǒng)節(jié)點來訪問讥巡,這些設備文件和普通文件之間的唯一差別在于對普通文件的訪問可以前后移動訪問位置,而大多數(shù)字符設備是一個只能順序訪問的數(shù)據(jù)通道舔哪。一個字符設備是一種字節(jié)流設備欢顷,對設備的存取只能按順序按字節(jié)的存取而不能隨機訪問,字符設備沒有請求緩沖區(qū)捉蚤,所有的訪問請求都是按順序執(zhí)行的抬驴。但事實上現(xiàn)在一些高級字符設備也可以從指定位置一次讀取一塊數(shù)據(jù)。塊設備
塊設備也是通過設備節(jié)點來訪問缆巧。塊設備上能夠容納文件系統(tǒng)布持。在大多數(shù)unix系統(tǒng)中,進行I/O操作時塊設備每次只能傳輸一個或多個完整的塊陕悬,而每塊包含512字節(jié)(或更2的更高次冪字節(jié)的數(shù)據(jù))题暖。linux可以讓應用程序向字符設備一樣讀寫塊設備,允許一次傳遞任意多字節(jié)的數(shù)據(jù)捉超。因而胧卤,塊設備和字符設備的區(qū)別僅僅在于內(nèi)核內(nèi)部管理數(shù)據(jù)的方式,也就是內(nèi)核及驅(qū)動程序之間的軟件接口狂秦,而這些不同對用戶來講是透明的灌侣。在內(nèi)核中,和字符驅(qū)動程序相比裂问,塊驅(qū)動程序具有完全不同的接口侧啼。存儲設備一 般屬于塊設備,塊設備有請求緩沖區(qū)堪簿,并且支持隨機訪問而不必按照順序去存取數(shù)據(jù)痊乾,比如你可以 先存取后面的數(shù)據(jù),然后在存取前面的數(shù)據(jù)椭更,這對字符設備來說是不可能的哪审。Linux下的磁盤設備都是塊設備,盡管在Linux下有塊設備節(jié)點虑瀑,但應用程序一般是通過文件系統(tǒng)及其高速緩存來訪問塊設備的,而不是直接通過設備節(jié)點來讀寫塊設備上的數(shù)據(jù)湿滓。網(wǎng)絡設備
網(wǎng)絡設備不同于字符設備和塊設備滴须,它是面向報文的而不是面向流的,它不支持隨機訪問叽奥,也沒有請求緩沖區(qū)扔水。由于不是面向流的設備,因此將網(wǎng)絡接口映射到文件系統(tǒng)中的節(jié)點比較困難朝氓。內(nèi)核和網(wǎng)絡設備驅(qū)動程序間的通訊魔市,完全不同于內(nèi)核和字符以及塊驅(qū)動程序之間的通訊,內(nèi)核調(diào)用一套和數(shù)據(jù)包傳輸相關(guān)的函數(shù)而不是read赵哲,write待德。網(wǎng)絡接口沒有像字符設備和塊設備一樣的設備號,只有一個唯一的名字枫夺,如eth0将宪、eth1等,而這個名字也不需要與設備文件節(jié)點對應橡庞。
字符設備與塊設備的區(qū)別
- 字符設備是面向流的涧偷,最小訪問單位是字節(jié);而塊設備是面向塊的毙死,最小訪問單位是512字節(jié)或2的更高次冪燎潮。
- 字符設備只能順序按字節(jié)訪問,而塊設備可隨機訪問扼倘。
- 塊設備上可容納文件系統(tǒng)确封,訪問形式上,字符設備通過設備節(jié)點訪問再菊,而塊設備雖然也可通過設備節(jié)點訪問爪喘,但一般是通過文件系統(tǒng)來訪問數(shù)據(jù)的。
- 網(wǎng)絡設備沒有設備節(jié)點是因為纠拔,網(wǎng)絡設備是面向報文的秉剑,很難實現(xiàn)相關(guān)read、write等文件讀寫函數(shù)稠诲。所以驅(qū)動的實現(xiàn)也與字符設備和塊設備不同侦鹏。
字符設備與塊設備的區(qū)分
每一個字符設備或者塊設備都在/dev目錄下對應一個設備文件。讀者可以通過查看/dev目錄下的文件的屬性臀叙,來區(qū)分設備是字符設備還是塊設備略水。使用cd命令進入/dev目錄,并執(zhí)行l(wèi)s -l命令就可以看到設備的屬性
[root@tom /]# cd /dev /*進入/dev目錄*/
[root@tom dev]# ls -l /*列出/dev中文件的信息*/劝萤、
/*第1字段 2 3 4 5 6 7 8 */
crw-rw----+ 1 root root 14, 12 12-21 22:56 adsp
crw------- 1 root root 10, 175 12-21 22:56 agpgart
crw-rw----+ 1 root root 14, 4 12-21 22:56 audio
brw-r----- 1 root disk 253, 0 12-21 22:56 dm-0
brw-r----- 1 root disk 253, 1 12-21 22:56 dm-1
crw-rw---- 1 root root 14, 9 12-21 22:56 dmmidi
ls -l命令的第1個字段中的第1個字符c表示設備是字符設備渊涝,b表示設備是塊設備;
第234字段對驅(qū)動程序開發(fā)來說沒有關(guān)系;
第5跨释,6字段分別表示設備的主設備號和次設備號胸私;
第7字段表示文件的最后修改時間。第8字段表示設備的名字鳖谈。
由第1和8字段可知盖文,adsp是字符設備,dm-0是塊設備蚯姆。其中adsp設備的主設備號是14,次設備號是12洒敏。
混雜設備
在linux系統(tǒng)中龄恋,存在一類字符設備,它們共享一個主設備號(10)凶伙,但次設備號不同郭毕,我們稱這類設備為混雜設備(miscdevice)。所有的混雜設備形成一個鏈表函荣,對設備訪問時內(nèi)核根據(jù)次設備號查找到相應的miscdevice設備显押。
- 混雜設備與字符驅(qū)動的區(qū)別:
- 相對字符驅(qū)動而言,內(nèi)核封裝好了api傻挂,相對更容易開發(fā)乘碑;
-
由于只占用一個從設備號,故而每一個驅(qū)動都只能用于一個設備金拒,無法和字符驅(qū)動比兽肤,能夠用于多個設備;
驅(qū)動開發(fā)流程
- 查看原理圖绪抛,理解設備的工作原理资铡。
- 定義主設備號。
設備由一個主設備號和一個次設備號來標識幢码。主設備號唯一標識了設備類型笤休,即設備驅(qū)動程序類型,它是塊設備表或字符設備表中設備表項的索引症副。次設備號僅
由設備驅(qū)動程序解釋店雅,區(qū)分被一個設備驅(qū)動控制下的某個獨立的設備。 - 實現(xiàn)初始化函數(shù)贞铣。在驅(qū)動程序中實現(xiàn)驅(qū)動的注冊和卸載底洗。
- 設計所要實現(xiàn)的文件操作,定義file--operations結(jié)構(gòu)咕娄。
- 實現(xiàn)所需的文件操作調(diào)用亥揖,如read,write等。
- 實現(xiàn)中斷服務费变,并用request--irq向內(nèi)核注冊摧扇,中斷并不是每個設備驅(qū)動所必需的。
- 編譯該驅(qū)動程序到內(nèi)核中挚歧,或者用insmod命令加載模塊扛稽。
- 測試該設備,編寫應用程序滑负,對驅(qū)動程序進行測試在张。
參考
linux驅(qū)動開發(fā)流程
linux設備驅(qū)動第一篇:設備驅(qū)動程序簡介
Linux設備驅(qū)動開發(fā) - 混雜設備驅(qū)動