模塊參數
設備驅動程序有時候需要接受參數,例如當模塊可以實現兩種相似功能時,可以傳遞一個參數到驅動模塊以決定其使用哪種功能,例如在加載模塊時指定 insmod xxx.ko param=1
可以使用 “module_param(參數名,參數數據類型,參數讀寫權限)” 來爲模塊定義個參數,例如下列代碼定一個了一個長整形和整形參數
static long a=1;
static int b=1;
module_param(a,long,S_IRUGO);
module_param(a,long,S_IRUGO);
參數數據類型可以有 : byte、short、ushort、int、uint、long、ulong、bool、和charp(字符指針類型)
內核對浮點支持不完美,printk()函數也不支持浮點類型。
模塊的文件格式ELF
使用 file 命令可以知道模塊使用的是ELF文件格式
模塊之間的通信實例
add_sub模塊
//add_sub.c
#include<linux/init.h>
#include<linux/module.h>
#include "Add_Sub.h"
long add_integer(int a,int b)
{
return a+b;
}
long sub_integer(int a,int b)
{
return a-b;
}
EXPORT_SYMBOL(add_integer);
EXPORT_SYMBOL(sub_integer);
MODULE_LICENSE("DUAL BSD/GPL");
EXPORT_SYMBOL 導出宏,讓內核知道其定義的函數可以被其他函數使用,但是,千萬不要隨便使用,很容易出現同名函數
//add_sub.h
#ifndef _ADD_SUB_H_
#define _ADD_SUB_H_
long add_integer(int a,int b);
long sub_integer(int a,int b);
#endif
測試所用 test模塊
通過參數決定調用add_integer()還是sub_integer()函數
#include<linux/init.h>
#include<linux/module.h>
#include "Add_Sub.h"
static int a=1;
static int b=1;
static int AddOrSub=1;
static int test_init(void)
{
long result=0;
printk(KERN_ALERT "test init\n");
if(1==AddOrSub)
result = add_integer(a,b);
else
result = sub_integer(a,b);
printk(KERN_ALERT "the %s result is %ld\n",AddOrSub==1?"add":"sub",result);
return 0;
}
static void test_exit(void)
{
printk(KERN_ALERT "test_exit\n");
}
module_init(test_init);
module_exit(test_exit);
module_param(a,int,S_IRUGO);
module_param(b,int,S_IRUGO);
module_param(AddOrSub,int,S_IRUGO);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("ChuncanL");
MODULE_DESCRIPTION("test module for AddOrSUB");
MODULE_VERSION("V1.0");
Add_Sub Makefile
obj-m := Add_Sub.o
KDIR :=/home/can/tiny4412/linux-3.8
all:
make -I $(PWD) -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers modul* *oper
test Makefile
obj-m := test.o
KDIR :=/home/can/tiny4412/linux-3.8 # arm
SYMBOL_INC = $(PWD)/../Add_Sub/
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers modul* *oper
測試test模塊前需要先加載Add_Sub模塊
root@NanoPC:~/a# insmod Add_Sub.ko
root@NanoPC:~/a# insmod test.ko a=2 b=3 AddOrSub=0
root@NanoPC:~/a# dmesg |tail
[51429.564912] test init
[51429.564949] the sub result is -1