1. 這個驅動有啥不同
最近發現很多教程,上來就是往寫led驅動,對於新手我
,看到了一種更適合作為驅動設計hello world的寫法,因此有了這篇博文。事不宜遲主要介紹一下這個驅動設計有啥不同:
[1] 其中p5有詳細的流程介紹
2. 驅動的實現
2.1 驅動開發的架構
圖2-1 驅動開發架構示意圖
2.2 驅動原始檔
#include
#include
// 定義模組入口函式
static
int __init hello_world_init
(void
)// 定義模組出口函式
static
void __exit hello_world_exit
(void
)// 註冊模組出口、入口函式
module_init
(hello_world_init)
;module_exit
(hello_world_exit)
;// 模組其他資訊
module_license
("gpl");
module_author
("www.czw1998.icu");
module_description
("this is a hello world module!"
);
編譯驅動並非使用系統自帶的gcc編譯器,而是使用核心原始碼中的編譯器,我們指定的頭檔案目錄也有所差別。驅動程式設計所用到的標頭檔案通常位於核心原始碼中的include/linux/。對於ubuntu中的核心原始碼位於/usr/src/。但是你會發現這個目錄下可能還有多個資料夾如圖2-2,那麼怎麼確定自己的核心版本呢?可以使用uname -r檢視當前系統的核心版本如圖2-2。
圖2-2 如何確定核心原始碼包以及版本
驅動模組必須通過模組安裝命令(insmod)才能安裝到核心中,同時已安裝的驅動模組也只能通過模組解除安裝命令(rmmod)才能從核心中解除安裝,在模組的安裝/解除安裝中,通常涉及到硬體資源的申請/釋放,為了完成這一操作,linux引入模組入口以及出口函式的機制,模組安裝系統將呼叫module_init註冊的函式,模組的解除安裝系統將呼叫module_exit註冊的函式。
模組除了具體的實現**之外,模組還需要新增一些模組的其他資訊(不是必須),方便模組的使用者更好的了解模組,可以通過modinfo檢視模組資訊,比如如下檢視hello_world.ko資訊
圖2-3 使用modinfo檢視模組資訊
2.3 驅動編譯指令碼makefile
obj-m=hello_world.o
# 定義一些變數
pwd=$(shell pwd)
kernel_version=$(shell uname -r)
kernel_path=/usr/src/linux-headers-$(kernel_version)
default:
make -c $(kernel_path) m=$(pwd) modules
clean:
make -c $(kernel_path) m=$(pwd) clean
編譯驅動模組最好借助makefile,可以大大的簡化你重複編譯的繁瑣性,同時可以使得編譯的操作流程更加清晰,簡單的解讀一下如上的makefile檔案:
圖2-4 make輸出資訊
3. 實驗
3.1 驅動模組的編譯
圖3-1 編譯
3.2 驅動模組的安裝及資訊檢視
圖3-2 驅動模組的安裝及資訊檢視
3.1 驅動模組的解除安裝及資訊檢視
圖3-3 驅動模組的解除安裝及資訊檢視
驅動版的「Hello World」
我們學習程式設計,都是從 hello world 開始的,驅動程式也不例外,今天我就寫乙個驅動版的 hello world 來熱熱身,目的希望大家能對驅動程式的基本框架有所了解。驅動程式分為2類,乙個是kernel模式驅動,另乙個是windows模式驅動,2種模式本質是相同,但細節不同,本文介紹的是...
helloworld驅動程式
mkdir opt embedsky modules cd modules mkdir hello cd hello vim hello.c hello 驅動 如下 hello.c qudong duopin 2012.4.22 include include module license gpl ...
驅動學習筆記 Hello World !
編譯環境用xp下vc6 ddk 新建乙個資料夾當作工程目錄,路徑是e lingdux 從別的工程copy過來兩個檔案,乙個是makefile,它用來指定檔案之間的依賴關係,確定專案中哪些檔案時需要重新編譯的,那些事已經編譯過的。裡面的內容不用改,直接預設就ok 另乙個是source,它用來儲存一些配...