應用程式、庫、核心、驅動程式的關係
以驅動led為例:
應用程式使用庫提供的 open 函式開啟代表 led 的裝置檔案。
庫根據 open 函式傳入的引數執行swi
指令,該指令會引起 cpu 異常,進入核心。
核心的異常處理函式根據這些引數找到相應的驅動程式,返回乙個檔案控制代碼給庫, 進而返回給應用程式
應用程式得到檔案控制代碼後,使用庫提供的 write 或 ioclt 函式發出控制命令。
庫根據 write 和 ioclt 函式傳人的引數執行swi
指令, 這條指令會引起 cpu 異常,進入核心。
核心的異常處理函式根據這些引數呼叫驅動程式的相關函式,點亮 led。
在異常處理函式中,核心會根據傳入的引數執行各種操作,比如根據裝置檔名找到對應的驅動程式,呼叫驅動程式的相關函式等。一般來說,當應用程式呼叫 open、read、write、ioctl、mmap 等函式後,將會使用驅動程式中的 open、read、write、ioctl、mmap 函式來執行相關操作,比如初始化、讀、寫等。實際上,核心和驅動程式之間並沒有界線,因為驅動程式最終是要編進核心去的:通過靜態鏈結和動態載入。
linux 驅動程式分類
1. 字元裝置
字元裝置是能夠像位元組流(比如檔案)一樣被訪問的裝置,就是說對它的讀寫是以位元組為單位的。字元裝置的驅動程式中實現了 open、close、read、write 等系統呼叫,應用程式可以通過裝置檔案(比如/dev/ttysac0
等)來訪問字元裝置。
2. 塊裝置
塊裝置上的資料以塊的形式存放,比如 nand flash 上的資料就是以頁為單位存放的。塊裝置驅動程式向使用者層提供的介面與字元裝置一樣,應用程式也可以通過相應的裝置檔案(如/dev/mtdblock0
、/dev/hda1
等)來呼叫 open、close、read、write 等系統呼叫,與塊裝置傳送任意位元組的資料。對使用者而言,字元裝置和塊裝置的訪問方式沒有差別。塊裝置驅動程式的特別之處如下:
3. 網路介面
網路介面同時具有字元裝置、塊裝置的部分特點,無法將它歸入這兩類中:如果說它是字元裝置,他的輸入/輸出卻是有結構的、成塊的(報文、包、幀);如果說它是塊裝置, 它的塊又不是固定大小的,大到數百甚至數千位元組,小到幾位元組。unix 式的作業系統訪問網路介面的方法是給它們分配乙個惟一的名字(比如 eth0),但這個名字在檔案系統中(比如/dev 目錄下)不存在對應的節點項。應用程式、核心和網路驅動程式間的通訊完全不同於字元裝置、塊裝置,庫、核心提供了一套和資料報傳輸相關的函式,而不是 open、 read、write 等。
linux 驅動程式開發步驟
linux 核心就是由各種驅動組成的,核心原始碼中有大約85%是各種驅動程式的**。一般來說,編寫乙個 linux 裝置驅動程式的大致流程如下:
- 檢視原理圖、資料手冊,了解裝置的操作方法。
- 在核心中找到相近的驅動程式,以它為模板進行開發,有時候需要從零開始。
- 實現驅動程式的初始化:如向核心註冊這個驅動,應用程式傳入檔名時核心才能找到相應的驅動程式。
- 設計所要實現的操作,比如 open、close、read、write 等函式。
- 實現中斷服務(中斷並不是每個裝置驅動所必須的)。
- 編譯該驅動程式到核心中,或者用 insmod 命令載入。
- 測試驅動程式。
驅動程式的載入和解除安裝
可以將驅動程式靜態編譯進核心中,也可以將它作為模組在使用時再載入。在配置核心時,如果某個配置選項被設為 m,就表示它將會被編譯成乙個模組。在 2.6 的核心中,模組的擴充套件名為.ko,可以使用 insmod 命令載入,使用 rmmod 命令解除安裝,使用 lsmod 命令檢視核心中已經載入了哪些模組。 當使用 insmod 載入模組時,模組的初始化函式被呼叫,它用來向核心註冊驅動程式。當使用 rmmod 解除安裝模組時,模組的清除函式被呼叫。
在驅動**中,這兩個函式要麼取固定的名字:init_module
和cleanup_module
,要麼使用以下兩行來標記它們(假設初始化函式、清除函式為my_init
和my_cleanup
)
moudle_init(my_init);
module_exit(my_cleanup);
openwrt字元裝置驅動開的概述
本此博文的主要目標在於 對linux核心,驅動有初步的認識 1 應用程式使用庫提供的open函式開啟代表led的裝置檔案 2 庫根據open函式傳入的引數執行swi指令,該指令會引起cpu的異常,進入核心。3 核心的一場處理函式根據這些引數找到相應的驅動程式,返回乙個檔案控制代碼給庫,進而返回給應用...
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...