[国嵌攻略][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);