openwrt字元裝置驅動開的概述

2021-07-24 00:13:50 字數 2106 閱讀 3251

本此博文的主要目標在於:

對linux核心,驅動有初步的認識

1).應用程式使用庫提供的open函式開啟代表led的裝置檔案

2).庫根據open函式傳入的引數執行swi指令,該指令會引起cpu的異常,進入核心。

3).核心的一場處理函式根據這些引數找到相應的驅動程式,返回乙個檔案控制代碼給庫,進而返回給應用程式

4).應用程式得到檔案控制代碼以後,使用庫提供的write或者ioct函式發出控制指令。

5).庫根據write和ioct函式傳入的引數執行「swi」指令,這條指令會引起cpu異常,進入核心

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

庫(比如 glibc)給應用程式提供的open read write ioctl mmap等介面的函式被稱為系統呼叫,他們都是設定好相關的暫存器後,執行某條指令引發異常進入系統核心。除系統呼叫介面外,褲還提供其他函式,比如字串處理函式(strcpy strcmp等)、輸入/輸出函式,數學庫,還有應用程式的啟動**等

在異常處理函式函式中,核心會根據傳入的引數執行各種動作,比如根據裝置檔名找到對應的驅動程式,呼叫驅動程式的相關函式等。一般來說,當應用程式呼叫open,read,write,ioctl,mmap等函式以後,將會使用驅動程式的open,read,write,ioctl,mmap函式來執行相關的操作,比如初始化,讀寫等。實際上,核心和驅動程式之間並沒有界限,因為驅動程式最終是要編進核心裡的:這個是通過靜態連線和動態的載入。

與應用程式不同,驅動程式從不主動執行,他是被動的;根據應用程式的要求初始化,根據應用程式的要求進行讀寫。驅動程式載入進核心時,只是告訴核心「我在這裡,我能做這些工作」,只用於這些工作是何時開始的,取決於應用程式。當然,這不是絕對的,不如使用者完全可以寫乙個系統時鐘觸發的驅動程式,讓他自動點亮led。

在linux系統中,應用程式執行於「使用者空間」,擁有mmu 的系統能夠限制應用程式的許可權(比如將他限制於某個記憶體塊當中),這個可以避免應用程式的錯誤是整個系統崩潰。而驅動程式執行於「核心空間」,它是系統信任的一部分,驅動程式的錯誤有可能導致整個系統的崩潰

2.linux驅動程式的分類

linux的外設可以分為3類:字元裝置,塊裝置和網路介面。

字元裝置是能夠像位元組流(比如檔案)一樣被訪問的裝置,就是說對他的讀寫是以位元組為單位的,比如串列埠在經行資料收發的時候就是乙個位元組乙個位元組進行的,我們可以在程式內部使用緩衝區來存放資料以提高效率,但是串列埠本身沒有這個要求。字元裝置的驅動程式中實現了open,close,read,write等系統呼叫,應用程式可以通過裝置檔案(比如/dev/ttysca0等)來訪問字元裝置。

塊裝置上的資料是以快的形式存放的,比如nand flash上的資料就是以頁為單位存放的。塊裝置驅動程式向使用者層提供的介面與字元裝置一樣,應用程式也可以通過相應的裝置檔案(比如/dev/mtblock0,/dev/hda1等)來呼叫open,close,read,write等系統呼叫,與塊裝置傳輸任意資料。對使用者而言,字元裝置與塊裝置的訪問方式沒有差別。但是塊裝置驅動程式的特別之處如下。

1).操作硬體介面的實現方式不一樣

塊裝置驅動程式先將使用者發來的資料組織成塊,再寫入裝置;或從裝置中讀出若干塊的資料,再從中挑出使用者需要的資料。

2).資料塊上的資料可以有一定的格式。

通常在塊裝置中按照一定的格式存放資料,不同的檔案系統給型別就是用來定義這些檔案系統型別的。核心中,檔案系統的層次位於塊裝置驅動程式上面,這意味著塊裝置驅動程式除了向使用者層提供提供與字元裝置一樣的介面外,還要向核心其他部件提供一些介面,這些介面使用者是看不到的,這些介面是使得可以在塊裝置上存放檔案系統,掛載塊裝置。

3).網路介面同時具有字元裝置,塊裝置的部分特點,無法將他歸入這兩類當中:如果說要他是字元裝置,他的輸入/輸出卻是有結構的,成塊的(報文,包,幀);如果說他是塊裝置,他的「塊」有不是固定大小的,大到數百甚至數千位元組,小到幾位元組。

unix式的作業系統訪問網路介面的方法是給他們分配乙個唯一的名字(比如 eth0)但是這個名字在檔案系統中(比如/dev 目錄下)不存在對應的節點項。應用程式,核心和網路驅動程式件的通訊完全不同於字元裝置,塊裝置,庫』核心提供了一套和資料報傳輸相關的函式,而不是open,read,和write。

3.簡單的記錄一下驅動程式的開發步驟:

linux核心就是各種驅動組成的,核心原始碼中大約有85%是由各種驅動程式的**

openwrt之字元裝置驅動開發

應用程式 庫 核心 驅動程式的關係 以驅動led為例 應用程式使用庫提供的 open 函式開啟代表 led 的裝置檔案。庫根據 open 函式傳入的引數執行swi指令,該指令會引起 cpu 異常,進入核心。核心的異常處理函式根據這些引數找到相應的驅動程式,返回乙個檔案控制代碼給庫,進而返回給應用程式...

openwrt之字元裝置驅動開發示例

1.將模板 mydrv 放到 openwrt 原始碼特定目錄 openwrt package kernel 下 2.配置對該驅動的編譯支援 cd openwrt make menuconfig 選擇 kernel modules other modules kmod mydrv 按 y 選中 儲存退...

arm linux驅動開發之字元裝置驅動開發

1 先要了解裝置函資料結構 2 然後將驅動註冊到核心中 define chrdevbase major 200 主裝置號 define chrdevbase name chrdevbase 裝置名 static char readbuf 100 讀緩衝區 static char writebuf 1...