linux設備驅動第一篇:基礎知識點

首先,咱們知道驅動是內核的一部分,那麼驅動在內核中到底扮演了什麼角色呢?linux

設備驅動程序在內核中的角色:他們是一個個獨立的「黑盒子」,使某個特定的硬件響應一個定義良好的內部編程接口,這些接口徹底隱藏了設備的工做細節。(說白了,驅動程序除了對外提供特定的接口外,任何實現細節對應用程序都是不可見的。)用戶的操做經過一組標準化的調用執行,而這些調用獨立於特定的驅動程序。驅動程序的任務是把這些標準化調用映射到實際硬件的設備特有操做上。程序員

在編寫驅動程序時,程序員應該特別注意下面這個概念:編寫訪問硬件的內核代碼時,不要給用戶強加任何特定策略。這句話個人理解是,驅動只負責實現最基本的硬件功能,而誰使用此硬件,怎麼使用,通常都不作考慮。編程

不帶策略的驅動程序包括一些典型的特徵:同時支持同步和異步操做、驅動程序可以被屢次打開、充分利用硬件特性,以及不具有用來「簡化任務」的或提供與策略相關的軟件層等。緩存

驅動程序就是應用程序與實際硬件之間的一個軟件層,相同的硬件,不一樣的驅動程序可能提供不一樣的功能。實際的驅動程序設計要在許多要考慮的因素之間作出平衡。總的來講,驅動程序設計主要仍是綜合考慮下面三個方面的因素:提供給用戶儘可能多的選項、編寫驅動程序要佔用的時間以及儘可能保持程序簡單而不至於錯誤叢生。微信

瞭解了驅動在內核中扮演的角色,咱們還能夠簡單瞭解下內核中包含的其餘模塊。通常把內核功能分紅以下幾部分:進程管理、內存管理、文件系統、設備控制、網絡功能。操做系統原理上面把操做系統的原理分爲:處理機管理、進程管理、文件管理、存儲管理、設備管理、網絡與通訊管理、用戶接口,其中處理機管理歸根到底其實就是進程管理。由於處理器的分配和執行都是以進程爲基本單位的。而存儲管理就是說的內存管理。網絡

進一步來看,電腦上有網卡,顯卡,聲卡等,還能夠外接U盤,打印機等等外設,那麼這麼多的設備有沒有分類呢?很明顯,根據設備的接口,咱們能夠知道分爲usb設備,串口設備,pci設備,spi設備,i2c設備等等,那麼在linux內核中又有樣的劃分呢?下面所述就是linux中對全部設備的一個分類,並描述了相互之間的簡單區別。微信公衆平臺

linux中設備和模塊的分類:異步

字符設備:字符設備是可以像字節流(相似文件)同樣被訪問的設備,有字符設備驅動程序來實現這種特性。字符設備驅動程序一般至少要實現open、close、read、write系統調用。字符設備能夠經過文件系統節點來訪問,這些設備文件和普通文件之間的惟一差異在於對普通文件的訪問能夠先後移動訪問位置,而大多數字符設備是一個只能順序訪問的數據通道。一個字符設備是一種字節流設備,對設備的存取只能按順序按字節的存取而不能隨機訪問,字符設備沒有請求緩衝區,全部的訪問請求都是按順序執行的。但事實上如今一些高級字符設備也能夠從指定位置一次讀取一塊數據。函數

塊設備:塊設備也是經過設備節點來訪問。塊設備上可以容納文件系統。在大多數unix系統中,進行I/O操做時塊設備每次只能傳輸一個或多個完整的塊,而每塊包含512字節(或更2的更高次冪字節的數據)。linux可讓應用程序向字符設備同樣讀寫塊設備,容許一次傳遞任意多字節的數據。於是,塊設備和字符設備的區別僅僅在於內核內部管理數據的方式,也就是內核及驅動程序之間的軟件接口,而這些不一樣對用戶來說是透明的。在內核中,和字符驅動程序相比,塊驅動程序具備徹底不一樣的接口。存儲設備一 般屬於塊設備,塊設備有請求緩衝區,而且支持隨機訪問而沒必要按照順序去存取數據,好比你能夠 先存取後面的數據,而後在存取前面的數據,這對字符設備來講是不可能的。Linux下的磁盤設備都是塊設備,儘管在Linux下有塊設備節點,但應用程序通常是經過文件系統及其高速緩存來訪問塊設備的,而不是直接經過設備節點來讀寫塊設備上的數據。spa

網絡設備:網絡設備不一樣於字符設備和塊設備,它是面向報文的而不是面向流的,它不支持隨機訪問,也沒有請求緩衝區。因爲不是面向流的設備,所以將網絡接口映射到文件系統中的節點比較困難。內核和網絡設備驅動程序間的通信,徹底不一樣於內核和字符以及塊驅動程序之間的通信,內核調用一套和數據包傳輸相關的函數而不是read,write。網絡接口沒有像字符設備和塊設備同樣的設備號,只有一個惟一的名字,如eth0、eth1等,而這個名字也不須要與設備文件節點對應。

由上大體總結下字符設備與塊設備的區別:一、字符設備是面向流的,最小訪問單位是字節;而塊設備是面向塊的,最小訪問單位是512字節或2的更高次冪。二、字符設備只能順序按字節訪問,而塊設備可隨機訪問。三、塊設備上可容納文件系統,訪問形式上,字符設備經過設備節點訪問,而塊設備雖然也可經過設備節點訪問,但通常是經過文件系統來訪問數據的。

而網絡設備沒有設備節點是由於,網絡設備是面向報文的,很難實現相關read、write等文件讀寫函數。因此驅動的實現也與字符設備和塊設備不一樣。


第一時間得到博客更新提醒,以及更多技術信息分享,歡迎關注我的微信公衆平臺:程序員互動聯盟(coder_online)

1.直接幫你解答linux設備驅動疑問點

2.第一時間得到業內十多個領域技術文章

3.針對文章內疑點提出問題,第一時間回覆你,幫你耐心解答

4.讓你和原創做者成爲很好的朋友,拓展本身的人脈資源

掃一掃下方二維碼或搜索微信號coder_online便可關注,咱們能夠在線交流。

相關文章
相關標籤/搜索