關於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<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

發佈了52 篇原創文章 · 獲贊 7 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章