close
Linux Driver(2) - kernel module的程式結構 模組載入函式(必要)當使用insmod或modprobe命令載入kernel module時,這函式會被呼叫,一般用來做初始化的工作。 模組卸載函式(必要)當通過rmmod命令移卸載模組時,這函式會被呼叫,一般用來做清除的工作。 模組許可證聲明(必要)聲明描述核心模組的權限,如果不聲明,將收核kernel tainted的警告。可接受的LICENSE有"GPL"、"GPL V2"等等,租屋我們在這裡使用最常見的"'Dual BSD/GPL"。 模組參數(可選)模組被載入時的參數 模組匯出符號(可選)讓其它模組可以使用本模組中的變數與函式 模組作者等資訊聲明(可選)只是印出一些作者和模組的資訊 我們以一個範例來說明,使用上一篇的hello.c和Makefile來修改,另外再加上一個func.c和func.o。func.c的內容: #include <linux/init.h> #include <linux/module.h> 室內設計MODULE_LICENSE("Dual BSD/GPL"); int sum(const int a, const int b) {     return a+b; } EXPORT_SYMBOL(sum); 說明:這裡主要是一個加總的函式而已func.h的內容: #ifndef _FUNC_H_ #define _FUNC_H_ int sum(const int a, const int b); #endif說明: 主要是等下給hello.c引入加總的函式hello.c的內容:#include <linux/init.h>#include 網路行銷<linux/module.h>#include "func.h"MODULE_LICENSE("Dual BSD/GPL");static char *str = "Default string";static int num = 0;static int hello_init(void){    printk(KERN_INFO "Hello, kernel\n");    printk(KERN_INFO "num=%d str=%s\n", num, str);    printk(KERN_INFO 澎湖民宿"1+2=%d\n", sum(1,2));    return 0;}static void hello_exit(void){    printk(KERN_INFO "Goodbye\n");}module_init(hello_init);module_exit(hello_exit);module_param(str, charp, S_IRUGO);module_param(num, int, S_IRUGO);MODULE_AUTHOR("hughes");MODULE_DESCRIPTION("A simple hello kernel 好房網module");MODULE_VERSION("version 1.0.0");MODULE_ALIAS("hello kernel");說明: 在hello_init裡接受輸入兩個參數,一個為數字,另一個為字串。我們使用moduel_param來告訴kernel說輸入的參數要存在那和類型是什麼,之後在載入的時後就會傳進來,但我給了default值,如果沒參數輸入的話,就會印出default值。hello_init的第三行使用了另一個module裡的sum函式。模組參數可使用的類票貼型有:byte、short、ushort、int、uint、long、ulong、charp(char*)、bool、intbool(反置的布林值)最後四行是定義模組的資訊,在shell輸入modinfo命令時,可看到。Makefile的內容:## Makefile for kernel test #MODULE_NAME      = helloFUNC_MODULE_NAME = funcKVERSION := $(shell uname -r)KERNEL_DIR = /usr/src/kernels/$(KVERSION)/ifdef NUM NUM_PARAM := 褐藻醣膠num=$(NUM)endififdef STR STR_PARAM := str=$(STR)endifobj-m := $(MODULE_NAME).o $(FUNC_MODULE_NAME).oall:    make -C $(KERNEL_DIR) M=$(PWD) modules    @echo     @echo ------module information------    @modinfo $(MODULE_NAME).ko    @echo ------------- end ------------    insmod 系統傢俱$(FUNC_MODULE_NAME).ko    insmod $(MODULE_NAME).ko $(NUM_PARAM) $(STR_PARAM)    $(PRINT_MESSAGE)clean:    rmmod $(MODULE_NAME)    rmmod $(FUNC_MODULE_NAME)    make -C $(KERNEL_DIR) M=$(PWD) clean    $(PRINT_MESSAGE)    define PRINT_MESSAGE    @echo 酒店兼職--------Message--------    @dmesg | tailendef說明: 在這裡,我們會判斷在輸入make時有沒有輸入NUM和STR這兩個參數,有的話就在insmod的時後帶給hello.ko。我們會先印出hello.ko的資訊,再引入func.ko和hello.ko兩個module,func.ko必需要先引入,因為hello.ko有使用它的sum函式,不然會找不到; 同樣的,移除的時後要先移除hello.ko,因為它正在使用func.ko的內容,最後再移除func.ko。
情趣用品

.msgcontent .wsharing ul li { text-indent: 0; }



分享

Facebook
Plurk
YAHOO!

arrow
arrow
    全站熱搜

    fu27funxgg 發表在 痞客邦 留言(0) 人氣()