驅動開發 1 模組hello world

2021-07-31 03:47:58 字數 2005 閱讀 1594

本文介紹在核心編譯模組、載入和解除安裝模組的過程。

首先開發環境是linux-4.4.0+兩份**,hello.c+makefile。

這兩份**放到**呢?答案是**都可以,不過要注意放在乙個資料夾下。這個資料夾的位置就是makefile中的current_path,編譯終端在這個資料夾開啟就行。

hello.c

/*編寫乙個helloworld向核心輸出*/

#include/*包含__init和__exit*/

#include/*必須包含*/

module_license("dual bsd/gpl");/*許可證,不然載入時會提示該模組汙染核心*/

static char *name = "yr";

static int __init name_init(void)

static void __exit name_exit(void)

module_init(name_init);/*載入模組時呼叫初始化函式*/

module_exit(name_exit);/*解除安裝模組時*/

module_param(name, charp, s_irugo);

關鍵部分有注釋,不過這離中文注釋要當心,博主一開始用的//被報錯了。

makefie如下:

#編譯後模組名

obj-m:=hello.o

#獲取當前終端路徑

current_path:=$(shell pwd)

#獲取linux核心路徑名

linux_kernel_path:=/usr/src/linux-source-4.4.0

all:

make -c $(linux_kernel_path) m=$(current_path) modules #c 表示進入核心目錄讀取makefile; m 表示回到當前目錄讀makefile

clean:

make -c $(linux_kernel_path) m=$(current_path) clean

注意到makefile中的注釋是#,$(shell + commond)就是命令列執行commond的效果。大家都清楚核心版本號用uname -r得到,核心原始碼路徑linux_kernel_path怎麼辦呢?c檔案中的可是引用核心中的標頭檔案的。核心原始碼一般在/usr/src資料夾下,不幸的博主這個資料夾下有好多4.4.0開頭的檔案,這個方法不奏效。解決方法是在/lib/module/$(shell uname -r)/build,這裡妥妥指的就是核心版本號啦。簡單說是,如果你不清楚核心**路徑,makefile中的linux_kernel_path:=/lib/module/$(shell uname -r)/build。

在這兩個文件所在檔案下開終端,執行sudo make編譯,成功的話,檔案下會產生很多新檔案,比如這樣:

然而這只是最後的結果,編譯過程並沒有看上去順利。小提醒,乙個大家可能會遇到的問題:***missing separator . stop,一般是makefile檔案中兩個make那一行開始需要用tab然而你用的是空格。如果用了tab還是會報同樣的錯——那你大概和博主遇到的問題一樣。看看gredit的編輯->首選項->編輯器,把「使用空格代替tab」前面的選項去掉。

現在已經編譯好啦~ sudo insmod ./hello.ko 載入模組,可以使用lsmod看到你的模組,dmesg看到printk的內容。

sudo rmmod hello解除安裝模組,lsmod看不到你的hello啦,dmesg可以看到對應printk的內容。

驅動開發之模組

模組 可以在執行時插入到核心中的 叫做模組 模組和應用程式的區別 應用程式 模組 1.執行空間 使用者空間 核心空間 2.入口函式 main 載入函式 3.庫 usr lib 核心原始碼庫 4.資源釋放 可以釋放 必須釋放 5.段錯誤的危害 危害小 危害大 模組三要素 模組許可證宣告 必須 modu...

linux驅動開發 模組引數

在我們使用模組的時候需要在裝載時傳遞引數給模組,linux 支援在裝載模組的同時傳入引數 比如 num 和who就是傳入模組的引數 insmod hello.ko num 10 who jack 模組引數必須用module parm巨集宣告,這個巨集定義在,剛才連個引數在模組中的定義如下 stati...

RTC模組驅動開發總結

1 rtc模組的裝置驅動模型 2 i2c模組的驅動模型 3 rtc模組涉及的檔案和資料結構 934x.c 該檔案為系統的硬體平台檔案,定義了rtc模組用到的硬體資源,包括記憶體位址空間,gpio,中斷資源,並將rtc裝置註冊進核心的裝置鍊錶中。rtc ds1307.c 該檔案為rtc模組的裝置驅動檔...