关于linux module 的调用

模块参数

设备驱动程序有时候需要接受参数,例如当模块可以实现两种相似功能时,可以传递一个参数到驱动模块以决定其使用哪种功能,例如在加载模块时指定 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
#include
#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
#include
#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

你可能感兴趣的:(arm)