驱动模块传参数

一、介绍

在应用程序中,可以通过 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”



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值