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变量的值。

Logo

更多推荐