目录
5.模块传参
类比应用层代码传参:
//应用层
int main(int argc,char *argv[]);
int mian(int argc,char **argv);
在 执行程序的时候,可以通过命令行的方式给main函数传递参数
//同样在执行内核模块的时候,也可以给内核模块传参
/linux/moduleparam.h头文件包含模块传参的信息
5.1模块传参函数
module_param(name,type,perm)
功能:内核模块传参
参数:
name: 变量名
type:参数的数据类型
perm:权限(0644),在sysfs可见
一般情况下,我们不需要在模块执行以后,进行参数传递,所以perm权限一般设置成0
1 #include <linux/init.h>
2 #include <linux/module.h>
3 #include <linux/kernel.h>
4 #include <linux/moduleparam.h>
5
6 int num = 10;
7
8
9
10 module_param(num, int, 0644);
11
12
13 int __init demo_init(void)
14 {
15 printk("module_param->num:%d\n",num);
16 printk(KERN_DEBUG "---%s---%s---%d---\n",__FILE_ _,__func__,__LINE__);
17 return 0;
18 }
19
20 void __exit demo_exit(void)
21 {
22 printk(KERN_DEBUG "---%s---%s---%d---\n",__FILE__ ,__func__,__LINE__);
23 }
在加载内核模块的时候进行参数的传递
加载模块的时候不去传参,默认参数是10
去此路径下可以找到对应的参数文件,权限是644
5.2模块传递字符串参数函数
module_param_string(name,string,len,perm);
功能: 模块传参
name: 外部传参名 外部传参名一般情况下和内部变量名设置成一样的
string: 内部变量名
len:长度
perm:权限
#define N 32
8
9 char buf[N] = "adaswe";
10 int num = 10;
11 char *p = "hello";
12 module_param(num, int, 0644);
13 module_param(p, charp, 0);
14 module_param_string(buf_ex,buf,N,0);
15 int __init demo_init(void)
16 {
17 printk("module_param->num:%d\n",num);
18 printk("module_param->p:%s\n",p);
19 printk("module_param->buf:%s\n",buf);
20 printk(KERN_DEBUG "---%s---%s---%d---\n",__FILE_ _,__func__,__LINE__);
21 return 0;
22 }
编译,运行:
dmesg打印内核信息:
5.3模块传递数组参数函数
module_param_array(name,type,nump,perm)
name:参数名
type:类型 int short ushort charp
nump: 指针类型,该地址存放的是传入的参数个数(数组元素的个数)
perm:权限,在sysfs可见
dmesg打印信息
六.模块参数表导出
实现模块间函数相互调用
/export.h下
exp.c:
usr.c:
先声明外部函数,然后再调用
EXPORT_SYMBOL_GPL导出符号表后,其他模块函数可以调用此函数
Moudule.symvers是导出符号表文件,usr想调用exp的func函数的话必须有此文件,否则编译会报错
加载完毕后dmesg查看信息