概述
一、介绍
在应用程序中,可以通过 main 函数向其中传参数,实际上在加载模块的时候也是可以向其中传参数的。
在头文件“include/linux/moduleparam.h”中包含了向模块传参数的函数。这个功能是集成的,在任何 linux 系统之中都可以使用。
参数传递有两个函数,分别是函数 module_param 和函数 module_param_array。
1、函数 module_param 支持单个参数传递
#define module_param(name, type, perm) module_param_named(name, name, type, perm)
参数 name,模块参数的名称;
参数 type,模块参数的数据类型(支持 int long short uint ulong ushort 类型);
参数 perm,模块参数的访问权限(S_IRUSR 参数表示所有文件所有者可读)。
2、函数 module_param_array 支持多个参数传递,在头文件中,如下图所示。、
#define module_param_array(name, type, nump, perm) module_param_array_named(name, name, type, nump, perm)
参数 name,模块参数的名称;
参数 type,模块参数的数据类型(支持 int long short uint ulong ushort 类型);
参数 nump,保存参数的数量;
参数 perm,模块参数的访问权限(S_IRUSR 参数表示所有文件所有者可读)。
参数 perm 表示此参数在 sysfs 文件系统中所对应的文件节点的属性,其权限在“include/linux/stat.h”中有定义
#define S_IRWXU 00700
#define S_IRUSR 00400
#define S_IXUSR 00100
#define S_IWUSR 00200
#define S_IWGRP 00020
#define S_IRWXG 00070#define S_IRGRP 00040
#define S_IROTH 00004
#define S_IXGRP 00010#define S_IRWXO 00007
#define S_IXOTH 00001
#define S_IWOTH 00002
部分常用参数权限解释如下。
– #defineS_IRUSR 00400 文件所有者可读
– #defineS_IWUSR00200 文件所有者可写
– #defineS_IXUSR 00100 文件所有者可执行
– #defineS_IRGRP00040 与文件所有者同组的用户可读
– #defineS_IWGRP00020
– #defineS_IXGRP 00010
– #defineS_IROTH 00004 与文件所有者不同组的用户可读
– #defineS_IWOTH00002
– #defineS_IXOTH 00001
其它的可以使用下面的方法来判断:
可以将数字最后三位转化为二进制:xxx xxx xxx,高位往低位依次看,第一位为 1 表示文件所有者可读,第二位为 1 表示文件所有者可写,第三位为 1 表示文件所有者可执行;接下来三位表示文件所有者同组成员的权限;再下来三位为不同组用户权限。
二、Makefile文件
#!/bin/bash
#通知编译器我们要编译模块的哪些源码
#这里是编译itop4412_hello.c这个文件编译成中间文件mini_linux_module.o
obj-m += module_param.o #源码目录变量,这里用户需要根据实际情况选择路径
KDIR := /home/iTop4412_Kernel_3.0
#作者是将Linux的源码拷贝到目录/home/topeet/android4.0下并解压的#当前目录变量PWD ?= $(shell pwd)#make命名默认寻找第一个目标
#$(PWD)当前目录变量
#make -C就是指调用执行的路径#$(KDIR)Linux源码目录,作者这里指的是/home/topeet/android4.0/iTop4412_Kernel_3.0#modules要执行的操作all:
rm -rf *.mod.c *.o *.order *.ko *.mod.o *.symvers
make -C $(KDIR) M=$(PWD) modules#make clean执行的操作是删除后缀为o的文件
clean:
三、源代码
#include <linux/init.h>
/*包含初始化宏定义的头文件,代码中的module_init和module_exit在此文件中*/
#include <linux/module.h>
/*定义module_param module_param_array的头文件*/
/*包含初始化加载模块的头文件,代码中的MODULE_LICENSE在此头文件中*/
/*定义module_param module_param_array中perm的头文件*/
#include <linux/moduleparam.h>#include <linux/stat.h>
MODULE_AUTHOR("iTOPEET_dz");
MODULE_LICENSE("Dual BSD/GPL");/*声明是开源的,没有内核版本限制*//*声明作者*/
module_param(module_arg1,int,S_IRUSR);
static int module_arg1,module_arg2;static int int_array[50];static int int_num;
static int hello_init(void)
module_param(module_arg2,int,S_IRUSR);module_param_array(int_array,int,&int_num,S_IRUSR);{int i;
for(i=0;i<int_num;i++){
printk(KERN_EMERG "module_arg1 is %d!n",module_arg1);printk(KERN_EMERG "module_arg2 is %d!n",module_arg2);
static void hello_exit(void)
printk(KERN_EMERG "int_array[%d] is %d!n",i,int_array[i]);}printk(KERN_EMERG "Hello World enter!n");/*打印信息,KERN_EMERG表示紧急信息*/return 0;}{
/*卸载函数*/
printk(KERN_EMERG "Hello world exit!n");}module_init(hello_init);/*初始化函数*/
module_exit(hello_exit);
四、实验操作
1、进行make生成ko文件
2. 在开发板上的最小系统上输入tftp -g -l module_param.ko -r module_param.ko 192.168.0.12,下载module_param.ko
3、使用命令“insmod /mnt/udisk/module_param.ko module_arg1=10
module_arg2=20 int_array=11,12,13,14,15,16,17,18”加载驱动 module_param.ko
使用 cat 命令在系统的 module 下查参数。
使用命令“cat /sys/module/module_param/parameters/xxx”
最后
以上就是香蕉百褶裙为你收集整理的驱动模块传参数一、介绍二、Makefile文件三、源代码四、实验操作的全部内容,希望文章能够帮你解决驱动模块传参数一、介绍二、Makefile文件三、源代码四、实验操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复