[国嵌攻略][105][内核模块可选项]

模块申明

1.MODULE_LICENSE(“遵守的协议”)

申明该模块遵守的许可证协议,如:”GPL”,”GPL v2”等

 

2.MODULE_AUTHOR(“作者”)

申明模块的作者

 

3.MODULE_DESCRIPTION(“模块的功能描述”)

申明模块的功能

 

4.MODULE_VERSION(“V1.0”)

申明模块的版本

 

模块参数

内核模块中通过命令行输入的参数叫做模块参数

通过宏module_param指定保存参数的变量。模块参数用于在加载模块时传递参数给模块。

格式:

module_param(name, type, perm)

name:变量名称

type:变量类型,bool:布尔类型,int:整型,charp:字符串类型

perm:访问权限,S_IRUGO:读权限,S_IWUSR:写权限

示例:

int a = 1;

char *str;

module_param(a, int, S_IRUGO | S_IWUSR);

module_param(str, charp, S_IRUGO | S_IWUSR);

使用:

insmod hello.ko a=2 str=hello

 

符号输出

内核模块中实现的函数需要被另外一个内核模块调用时,需要用到模块符号输出。

内核模块符号的输出使用的宏:

EXPORT_SYMBOL(符号名)

EXPORT_SYMBOL_GPL(符号名)

说明:

其中EXPORT_SYMBOL_GPL只能用于包含GPL许可证的模块。

 

Makefile

obj-m := hello.o add.o

KDIR := /space/work/guoqian/liunxkernel/000/kernel/linux-mini2440

all :
    make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
    
clean :
    @rm -f *.o *.ko *.mod.* *.order *.symvers

 

hello.ko

#include <linux/init.h>
#include <linux/module.h>

//全局变量声明
int num;
char *str;

//函数原型声明
extern int add(int a, int b);

//加载函数
static int hello_init(){
    printk(KERN_WARNING"hello_init!num is %d\n", num);
    printk("1 + 1 = %d\n", add(1, 1));
    
    return 0;
}

//卸载函数
static void hello_exit(){
    printk(KERN_WARNING"hello_exit!str is %s\n", str);
}

//模块信息声明
MODULE_LICENSE("GPL");
MODULE_AUTHOR("D");
MODULE_DESCRIPTION("hello");
MODULE_VERSION("v1.0");

//模块参数声明
module_param(num, int, S_IRUGO | S_IWUSR);
module_param(str, charp, S_IRUGO | S_IWUSR);

//模块函数声明
module_init(hello_init);
module_exit(hello_exit);

 

add.c

#include <linux/init.h>
#include <linux/module.h>

int add(int a, int b){
    return a + b;
}

//加载函数
static int add_init(){
    return 0;
}

//卸载函数
static void add_exit(){

}

//模块信息声明
MODULE_LICENSE("GPL");
MODULE_AUTHOR("D");
MODULE_DESCRIPTION("add");
MODULE_VERSION("v1.0");

//模块符号输出
EXPORT_SYMBOL(add);

//模块函数声明
module_init(add_init);
module_exit(add_exit);

 

你可能感兴趣的:([国嵌攻略][105][内核模块可选项])