Linux驅動學習 Linux裝置驅動概述

2021-05-02 12:49:51 字數 1740 閱讀 7403

linux裝置驅動概述

以點亮led為例:包括應用程式、庫、作業系統、核心、驅動程式。而開發人員中

只要關注自己的那一層,相鄰層只關注介面就可以了

1,應用程式使用庫提供的open函式開啟led的裝置檔案

2,庫根據open函式傳入的引數執行「swi」指令,這是軟中斷,這條指令會引起

cpu異常,進入核心

3,核心異常處理函式就會根據這些引數找到相應的驅動程式,返回乙個

控制代碼給庫,進而返回給應用程式

4,應用程式得到控制代碼後,使用庫提供的write和ioctl函式發出控制指令

5,庫根據write和ioctl函式傳入的引數執行「swi」指令,再次引起cpu異常

進入核心

6,核心根據異常處理函式根據這些引數呼叫驅動程式的相關函式,點亮led

在異常處理函式中,核心會根據傳入的引數執行各種操作,比如根據裝置檔名

找到對應的驅動程式,呼叫驅動程式的相關函式

另外,驅動程式從不主動執行,都是被動執行,但也不是絕對的,使用者完全可以

寫乙個由系統時鐘觸發的驅動,讓它自動點亮led

再者,應用程式執行在「使用者空間」,擁有mmu的系統能夠限定應用程式的許可權,只

執行在某指定記憶體塊當中,可以避免應用程式的錯誤導致系統崩潰,

而驅動程式是執行在核心態的,這是系統信任的一部分,驅動程式有錯誤可能

導致整個系統崩潰,呵呵,小心了呀

三種驅動型別的點滴

1,字元型裝置,收發是以位元組為單位進行的,驅動程式要實現

open,read,write,close等系統呼叫

2,塊裝置,資料是以塊的形式進行存放,如nand flash上以頁為單位進行存放

同時,驅動程式向使用者提供的介面與字元型裝置一樣,對使用者而言,塊裝置

和字元裝置的訪問方式是相同的。

區別在於,塊裝置驅動程式先將使用者傳送的資料組織成塊,再寫入裝置,或是從裝置中

讀入若干塊資料,再從中挑出使用者需要的。

資料塊上的資料可以有一定的格式。不同的檔案系統就是用來定義這種格式的。

3,網路裝置兼具兩種驅動的特點,它的輸入與輸出是有結構的,不像字元型驅動

同時,傳送的資料大小不等。另外,應用程式、核心和網路驅動程式間的通訊

完全不同於,字元裝置和塊裝置,庫、核心提供了一套和資料報傳輸相關的函式

而不是open,close,read,write等。

驅動程式的開發步驟:

大致流程如下:

1,檢視原理圖,資料手冊,大致了解硬體的操作方法

2,在核心中的找到相近的驅動程式,以此為模板進行開發,有時候需要從0開始

3,實現驅動的初始化,比如向核心註冊這個驅動程式,這樣應用呼叫時,核心才

能找到這個驅動程式

4,設計所要操作的實現,如open,clos,read,write等函式

5,實現中斷服務,但不是每個程式所必須的

6,編譯到核心或動態的載入

7,測試驅動程式

注意點:

1,在linux核心原始碼中大約有85%都是驅動

2,驅動編寫的難點不是硬體的具體操作,而是弄清楚驅動程式的框架

3,驅動程式可以同時被好幾個程序使用,要考慮到併發的問題

4,該不該使用dma,可以用也可以不用,使用可以提高效率,但是程式比較複雜。

5,在2.6核心中模組的檔名為.ko,可以使用insmod載入,使用rmmod缷載

可以使用lsmod來檢視載入的模組。

6,並不是只有驅動才可以編譯成模組,檔案系統也可以編譯成模組的。

linux驅動學習

1.在dev目錄下用ls l檢視字元裝置,輸出第一列為c的的標識的裝置,其中有主裝置號,和次裝置號 裝置檔案對應裝置驅動,linux將每個裝置對映成為乙個檔案,如果訪問檔案,那麼對應的訪問就是相應的io驅動程式,檔案和驅動主要是通過主裝置號聯絡起來的,次裝置號就是反應了具體是那個裝置 核心中 dev...

Linux驅動學習

1.make時使用make arch arm cross compile arm linux gnueabihf 命令而不是make命令 2.編譯.c檔案使用arm linux gnueabihf gcc o c生產可執行檔案 3.cat proc devices 只顯示驅動的主裝置號,且是分類顯示...

linux驅動學習

驅動學習筆記 1模組載入函式 模組載入的是觸發,載入完畢後就解除安裝 static int init mymodule init void module init mymodule init 2模組解除安裝函式 模組被關閉時觸發,或者系統被關閉時觸發 static void exit mymodul...