linux裝置驅動開發詳解
技術標籤:linux驅動
第四章 linux核心模組
1.linux核心模組的優點
1)模組可以不用編譯linux核心,在開發除錯的時候,通過動態載入命令載入進核心就可以執行,大大提升了開發除錯效率,同時也控制了linux核心的大小
2)模組一旦被載入,它就和linux核心其他的部分一樣,直接執行。
2.linux核心模組基本結構
linux核心包含主要的幾個基本功能函式和宣告函式,具體如下:
module_init()是模組的初始化(即載入)介面宣告函式,通過傳入自己編寫的裝置初始化介面,對模組進行初始化。
module_exit()是模組的退出(即解除安裝)函式宣告函式,通過傳入自己編寫的裝置退出介面,退出模組。
MODULE_AUTHOR()是模組作者宣告函式,傳入字串宣告模組的編寫者是誰
MODULE_LICENSE()模組許可宣告函式,宣告描述核心模組的許可許可權,如果不宣告,模組被載入的時候會被核心報核心汙染錯誤。可接受的核心許可許可權有:“GPL”,“GPL v2”,“GPL and additional rights”,“Dual BSD/GPL”,“Dual MPL/GPL”,“Proprietary”.
MODULE_DESCRIPTION()是模組功能描述函式,傳入描述模組功能的字串
MODULE_VERSION()是模組版本設定函式
下面這個模組是傳入兩個引數的模組,裡面是對兩個引數進行列印,具體程式碼實現如下:
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static char *book_name = "dissecting Linux Device Driver";
static int num = 4000;
static int book_init(void )
{
printk(KERN_INFO "book init \n");
printk(KERN_INFO "book name :%s\n", book_name);
printk(KERN_INFO "book_num: %d\n", num);
return 0;
}
static void book_exit(void)
{
printk(KERN_INFO "book exit! \n");
}
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 simple 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