hello world驅動設計 x86

2021-10-06 12:36:19 字數 2397 閱讀 1893

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,它用來儲存一些配...