Linux驱动(13)--传递参数
传递参数1. 头文件2. 源码与注释3. 运行过程与结果1. 头文件在加载模块的时候,可以向它传递参数。我们可以利用Linux中已经存在的函数来完成这个功能。该函数在头文件:/LinuxKernelPath/include/linux/moduleparam.h传递单个参数所用到的函数:module_param(name,type,perm)– name:要传递参数的名称– ty...
·
1. 头文件
在加载模块的时候,可以向它传递参数。我们可以利用Linux中已经存在的函数来完成这个功能。该函数在头文件:
/LinuxKernelPath/include/linux/moduleparam.h
- 传递单个参数
所用到的函数:module_param(name,type,perm)
– name:要传递参数的名称
– type: 参数的数据类型
– perm: 参数的访问权限(S_IRUSR表示所有文件所有者可读) - 传递多个参数
所用到的函数:module_param_array(name,type,nump,perm)
– name:要传递参数的名称
– type: 参数的数据类型
– nump: 保存参数个数的变量的地址
– perm: 参数的访问权限(S_IRUSR表示所有文件所有者可读)
2. 源码与注释
/*
Name:Pass_Param.c
Author:Ethan
Version:1.0
Date:2019-12-29
*/
/*包含初始化宏定义的头文件,代码中的module_init和module_exit再次文件中)*/
#include<linux/init.h>
/*包含初始化加载模块的头文件,代码中的MODULE_LICENSE在此头文件中*/
#include<linux/module.h>
/*定义module_param module_param_array的头文件*/
#include <linux/moduleparam.h>
/*定义module_param module_param_array中perm的头文件*/
#include <linux/stat.h>
/*声明是开源的,没有内核版本限制*/
MODULE_LICENSE("Dual BSD/GPL");
/*声明作者*/
MODULE_AUTHOR("Ethan");
/*声明用于传递的单个参数*/
static int module_arg1, module_arg2;
/*声明能用于传递多个参数的数组*/
static int int_array[50];
/*声明传递的多个参数的个数*/
static int int_num;
/*传递单个参数*/
module_param(module_arg1, int, S_IRUSR);
/*传递单个参数*/
module_param(module_arg2, int, S_IRUSR);
/*传递多个参数(数组)*/
module_param_array(int_array, int, &int_num, S_IRUSR);
/*编写初始化函数*/
static int hello_init(void)
{
int i;
/*打印参数信息*/
printk(KERN_EMERG "module_arg1 is %d! \n", module_arg1);
/*打印参数信息*/
printk(KERN_EMERG "module_arg2 is %d! \n", module_arg2);
/*打印数组参数信息*/
for(i = 0;i < int_num;i++){
printk(KERN_EMERG "int_array[%d] is %d! \n", i, int_array[i]);
}
return 0;
}
//编写卸载函数
static void hello_exit(void)
{
/*打印see you,KERN_KMERG表示紧急信息*/
printk(KERN_EMERG "See you!\n");
}
/*初始化函数*/
module_init(hello_init);
/*卸载函数*/
module_exit(hello_exit);
3. 运行过程与结果
运行的步骤为下:
① 将Pass_Param.c和Makefile文件移动到linux系统中的某一文件夹下(任意地方或者新建都可以)。
② 执行命令:
make
执行完毕之后可以在该文件夹下生成.ko文件,该文件就是编译生成的驱动。
③ 我们通过开发板来验证该驱动是否编写与编译成功:
—>将.ko文件拷贝到U盘中
—>用命令
mount /dev/sda1 /mnt/disk/
将U盘挂载。
—>可以用命令
ls /mnt/disk/
来列出已经编译成功的.ko文件
—>不传递参数,直接加载命令,来加载我们编译好的驱动
insmod /mnt/disk/Pass_Param.ko
加载结果为:
可以发现,不传入参数是,两个参数默认为0。
—>传递参数
insmod /mnt/disk/Pass_Param.ko module_arg1=10 module_arg2=20 int_array=11,12,13,14,15,16
加载结果为:
传递参数成功!
除此之外,还可以通过命令查询我们的参数:
cat /sys/module/Pass_Param/parameters/module_arg1
就可以查血module_arg1变量的值。
更多推荐
已为社区贡献9条内容
所有评论(0)