linux裝置驅動開發詳解

2021-10-12 16:39:39 字數 2761 閱讀 2491

第四章 linux核心模組

1.linux核心模組的優點

1)模組可以不用編譯linux核心,在開發除錯的時候,通過動態載入命令載入進核心就可以執行,大大提公升了開發除錯效率,同時也控制了linux核心的大小

2)模組一旦被載入,它就和linux核心其他的部分一樣,直接執行。

2.linux核心模組基本結構

linux核心包含主要的幾個基本功能函式和宣告函式,具體如下:

module_init()是模組的初始化(即載入)介面宣告函式,通過傳入自己編寫的裝置初始化介面,對模組進行初始化。

module_exit()是模組的退出(即解除安裝)函式宣告函式,通過傳入自己編寫的裝置退出介面,退出模組。

module_param()是模組引數宣告函式,對模組的執行需要的引數進行宣告。

module_author()是模組作者宣告函式,傳入字串宣告模組的編寫者是誰

module_license()模組許可宣告函式,宣告描述核心模組的許可許可權,如果不宣告,模組被載入的時候會被核心報核心汙染錯誤。可接受的核心許可許可權有:「gpl」,「gpl v2」,「gpl and additional rights」,「dual bsd/gpl」,「dual mpl/gpl」,「proprietary」.

module_description()是模組功能描述函式,傳入描述模組功能的字串

module_version()是模組版本設定函式

3.模組程式設計例項

下面這個模組是傳入兩個引數的模組,裡面是對兩個引數進行列印,具體**實現如下:

#include

#include

#include

module_license

("dual bsd/gpl");

static

char

*book_name =

"dissecting linux device driver"

;static

int num =

4000

;static

intbook_init

(void

)static

void

book_exit

(void

)module_init

(book_init)

;module_exit

(book_exit)

;module_param

(num,

int, s_irugo)

;module_param

(book_name, charp, s_irugo)

;module_author

("barry song <[email protected]>");

module_description

("a ****** module for testing module params");

module_version

("v1.0"

);

其中,**中的printk函式和printf函式的功能相同,輸出日誌資訊到命令列, 可以在linux終端使用dmesg進行檢視,在使用printk函式的時候,需要傳入對應的日誌輸出等級。

4.模組編譯對應的makefile

首先,由於現在的模組是在嵌入式開發板上執行的,所以在對模組源**進行make編譯之前,要先配置模組編譯環境,安裝模組編譯工具鏈,同時也要安裝開發板上執行的模組核心**,並對**進行安裝和編譯以後,才能完成對應的**編譯,具體的makefile**如下:

ifeq ($(kernelrelease),)

config_module_sig=n

ifeq ($(arch)

, arm)

kerneldir ?

=/home/liuniu/fs-mp1a/linux/fsmp1a-linux-

5.4.31

else

kerneldir ?

=/lib/modules/$(shell uname -r)

/build

endif

pwd :

= $(shell pwd)

modules:

$(make)

-c $(kerneldir) m=$(pwd) modules

clean:

rm -rf *

.o *

.ko .

*.cmd *

.mod.

* modules.order module.symvers .tmp_version s

else

obj-m :

= test_param.o

endif

其中 config_module_sig=n 命令是申請模組簽名的乙個配置

/home/liuniu/fs-mp1a/linux/fsmp1a-linux-5.4.31路徑是開發板原始碼在我的虛擬機器上的安裝路徑

模組原始碼編譯的時候,使用的編譯命令是:make arch=arm進行編譯。編譯完成以後生成.ko檔案,拷貝到開發板上進行載入測試。

5.模組安裝和解除安裝命令

1)安裝模組命令:

insmod test_param.ko book_name=『liuniu』 num=5000

2)解除安裝命令:

rmmod test_param.ko

《Linux裝置驅動開發詳解》 等待佇列

基礎知識 阻塞與非阻塞 阻塞操作是指在執行裝置操作時若不能獲得資源則掛起程序,直到滿足可操作的條件後再進行操作。被掛起的程序進入休眠狀態,被從排程器的執行佇列移走,直到等待的條件被滿足。而非阻塞操作的程序在不能進行裝置操作時並不掛起,它或者放棄,或者不停地查詢,直至可以進行操作為止。驅動程式通常需要...

《Linux裝置驅動開發詳解》 核心延時

10.6.1 短延遲 linux 核心中提供了如下 3 個函式分別進行納秒 微秒和毫秒延遲。void ndelay unsigned long nsecs void udelay unsigned long usecs void mdelay unsigned long msecs 上述延遲的實現原...

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

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...