第四章 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核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...