1. 程式人生 > 其它 >linux裝置驅動開發詳解

linux裝置驅動開發詳解

技術標籤:linux驅動

第四章 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 <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