linux字元裝置驅動設計
現實世界中存在著大量的裝置,作業系統要求能夠控制和管理這些硬體,而驅動就能幫助實現管理控制
下面我們從不同的角度理解一下驅動
驅動(device driver)相當於硬體的介面,它維護著我們的硬體,作業系統通過驅動這個介面才能控制硬體
驅動本身就是一段**,自己不會主動執行,而是被作業系統呼叫執行
驅動是核心的一部分,執行在核心空間
驅動和應用程式有什麼關係?
應用程式在執行中往往要用到硬體裝置,但應用程式不能直接呼叫驅動程式,因此要執行系統呼叫陷入核心態才能呼叫驅動
寫驅動需要我們懂哪些知識?
1,需要熟悉linux的核心機制
2,驅動程式與應用程式的介面
3,需要考慮系統對裝置的併發操作
4,需要非常熟悉所開發硬體的工作原理
linux下的驅動千篇一律嗎?
linux系統從各異的裝置中提取共性特徵,將其分為三大類:字元裝置、塊裝置、網路裝置。
字元裝置驅動是這三類中最常見的,而且linux中又有很多基於字元驅動封裝出來的驅動模型,例如:input裝置、framebuffer裝置、雜項裝置等等,今後學習中我們會有所介紹
每一類裝置驅動都有對應的驅動模型框架,降低了驅動程式設計的複雜度,大家都遵循固定的框架進行程式設計
在學習linux驅動之前我們要先建立起相關概念,我們將從以下幾點進行學習:
1.linux驅動程式的功能
對硬體進行初始化和控制
檢測和處理硬體出現的錯誤
負責從硬體讀資料和傳送資料給硬體裝置
接收應用程式傳送的資料和回送應用程式請求的資料
2.驅動程式與應用程式的區別
應用程式從頭到尾執行完整的任務;驅動程式完成初始化之後不再執行,等待應用程式呼叫執行
應用程式可以使用glibc等標準c函式庫;驅動程式不能使用標準c庫
驅動程式是核心的一部分,工作在核心態;應用程式工作在使用者態
3.應用程式、庫、核心、驅動程式的關係
應用程式呼叫函式庫完成一系列功能,一部分庫函式通過系統呼叫由核心完成相應功能,例如:printf、fread函式等等
核心處理系統呼叫,核心在實現系統呼叫時會根據需要呼叫裝置驅動程式操作硬體
裝置驅動是硬體裝置的直接控制者,它完成了核心和硬體的通訊任務
4.裝置驅動的種類
字元裝置
i/o傳輸過程中以字元為單位進行傳輸;
使用者對字元裝置發出讀/寫請求時,實際的硬體讀/寫操作一般緊接著發生
塊裝置塊裝置與字元相反,它的資料傳輸以塊(記憶體緩衝)為單位傳輸;
使用者對塊裝置讀/寫時,硬體讀/寫不會緊接著發生(即使用者請求和硬體操作是非同步的)
磁碟類、快閃儲存器類等裝置都封裝成塊裝置
網路裝置
網路裝置是一類特殊的裝置,它不像字元裝置或塊裝置那樣通過對應的裝置檔案訪問,也不能直接通過read或write進行資料請求,而是通過socket介面函式進行訪問
5.裝置檔案和主/從裝置號
裝置檔案是使用者程式與裝置驅動的乙個介面,應用程式通過操作裝置檔案來呼叫裝置驅動程式
linux把對硬體的操作全部抽象成對檔案的操作,其中包含了控制和資料傳輸操作,例如:open,read,write,close...
linux下的各種硬體裝置以檔案的形式存放於/dev目錄下,可以使用ls/dev 命令進行檢視
每個裝置檔案都有其檔案屬性(c或者b),表明其是字元裝置還是塊裝置
每個裝置檔案都有2個裝置號,在/dev目錄下使用「ll」或「ls-l」命令可以檢視各個裝置的裝置型別、主/從裝置號等詳細資訊
主裝置號:用於標識驅動程式,如果兩個裝置檔案的主裝置號相同,那他們使用同乙個驅動程式
從裝置號:用於標識同一驅動程式的不同硬體,為了能把不同的具體硬體分開,又通過從裝置號來區分使用相同驅動程式的不同裝置
例如:210開發板中的串列埠裝置,主裝置號標識串列埠這類裝置,從裝置號標識具體的某個串列埠
使用者通過「cat /proc/devices」命令可以檢視當前系統中主裝置號的使用情況,以及和硬體裝置的對應情況
1 讓你不再害怕指標 細說指標
指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別 指標所指向的型別 指標的值或者叫指標所指向的記憶體區 指標本身所佔據的記憶體區。讓我們分別說明。先宣告幾個指標放著做例子 例一 1 int ptr 2 char ptr 3 in...
1 讓你不再害怕指標 細說指標
指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別 指標所指向的型別 指標的值或者叫指標所指向的記憶體區 指標本身所佔據的記憶體區。讓我們分別說明。先宣告幾個指標放著做例子 例一 1 int ptr 2 char ptr 3 in...
8 讓你不再害怕指標 指標型別轉換
當我們初始化乙個指標或給乙個指標賦值時,賦值號的左邊是乙個指標,賦值號的右邊是乙個指標表示式。在我們前面所舉的例子中,絕大多數情況下,指標的型別和指標表示式的型別是一樣的,指標所指向的型別和指標表示式所指向的型別是一樣的。例十五 float f 12.3 float fptr f int p 在上面...