在编写内核模块的时候,经常需要在加载内核模块的时候传递一些参数,Linux内核提供了简单便捷的方法向内核模块传递参数
1 定义模块参数的方法
module_param(name, type, perm);
name:表示参数的名字;
type:表示参数的类型;
perm:表示参数的访问权限; (0664,0755)
2 数组类型模块参数的定义:
module_param_array(name, type, num, perm);
name:表示数组的名字;
type:表示参数的类型;
num :表示数组中元素数量;
perm:表示参数的访问权限;(0664,0775)
3 对变量的功能进行描述
MODULE_PARM_DESC(_parm, desc)
_parm:变量
desc :描述字段
4 type支持的基本类型有:
bool :布尔类型
invbool:颠倒了值的bool类型;
charp :字符指针类型,内存为用户提供的字符串分配;
int :整型
long :长整型
short :短整型
uint :无符号整型
ulong :无符号长整型
ushort :无符号短整型
5 注意传递参数时候要把变量加上 ,参数之间需要加上的空格
insmod hello.ko i=100
modinfo进行查看
例子如下
#include <linux/module.h>
#include <linux/in.h>
#include<linux/moduleparam.h>
int i=10;
char *s1="xiang jie";
module_param(i, int, 0664);
MODULE_PARM_DESC(_i, "int bian liang");//对int的描述
module_param(s1, charp, 0664);
MODULE_PARM_DESC(s1, "xiang is girl");//对int的描述
//入口函数
static int __init xiang_init(void)
{
printk("i==========%d\n",i);
printk("c==========%s\n",s1);
return 0;
}
//出口函数
static void __exit xiang_exit()
{
printk("xxxxxxxxxxxxxxx\n");
}
//对入口函数和出口的修饰
module_init(xiang_init);
module_exit(xiang_exit);
MODULE_LICENSE("GPL");
符号的导出:驱动程序之间存在有依赖关系,(第一个驱动程序可能会使用第二个驱动程序中的某个函数)
EXPORT_SYMBOL(函数的名字)//导出符号表十所调用的函数成为全局变量
例子如下
#include <linux/module.h>
#include <linux/in.h>
#include<linux/moduleparam.h>
int add(int a,int b)
{
return a+b;
}
EXPORT_SYMBOL( add);//变成全局变量
int sub(int a,int b)
{
return a-b;
}
EXPORT_SYMBOL( sub);//变成全局变量
//入口函数
static int __init xiang_init(void)
{
printk("aaaaaaaaaaaaaadd\n");
return 0;
}
//出口函数
static void __exit xiang_exit()
{
}
//对入口函数和出口的修饰
module_init(xiang_init);
module_exit(xiang_exit);
MODULE_LICENSE("GPL");
#include <linux/module.h>
#include <linux/in.h>
#include<linux/moduleparam.h>
int i=10;
char *s1="xiang jie";
module_param(i, int, 0664);
MODULE_PARM_DESC(_i, "int bian liang");//对int的描述
module_param(s1, charp, 0664);
MODULE_PARM_DESC(s1, "xiang is girl");//对int的描述
extern int add(int a,int b);
extern int sub(int a,int b);
//入口函数
static int __init xiang_init(void)
{
printk("i==========%d\n",i);
printk("%d\n",add(40,20));
printk("c==========%s\n",s1);
printk("%d\n",sub(30,20));
return 0;
}
//出口函数
static void __exit xiang_exit()
{
printk("xxxxxxxxxxxxxxx\n");
}
//对入口函数和出口的修饰
module_init(xiang_init);
module_exit(xiang_exit);
MODULE_LICENSE("GPL");