16_驱动模块传参数

itop4412学习记录

 

1. 相关头文件与函数

内核模块传参的头文件:“include/linux/moduleparam.h”

(1)module_param用来传单个参数

module_param(name,type,perm)
– name:模块参数的名称
– type: 模块参数的数据类型(支持int long short uint ulong ushort类型)
– perm: 模块参数的访问权限(S_IRUSR参数表示所有文件所有者可读)


(2)module_param_array用来传多个参数

module_param_array(name, type, nump, perm)
– name:模块参数的名称
– type: 模块参数的数据类型(支持int long short uint ulong ushort类型)
– nump:保存参数个数的地址
– perm: 模块参数的访问权限(S_IRUSR参数表示所有文件所有者可读)


(3)perm参数详解

参数perm表示此参数在sysfs文件系统中所对应的文件节点的属性,其权限在include/linux/stat.h中有定义。
变量perm
– #defineS_IRUSR  00400  文件所有者可读
– #defineS_IWUSR  00200  文件所有者可写
– #defineS_IXUSR  00100  文件所有者可执行
– #defineS_IRGRP  00040  与文件所有者同组的用户可读
– #defineS_IWGRP  00020  与文件所有者同组的用户可写
– #defineS_IXGRP  00010  与文件所有者同组的用户可执行
– #defineS_IROTH  00004  与文件所有者不同组的用户可读
– #defineS_IWOTH  00002  与文件所有者不同组的用户可写
– #defineS_IXOTH  00001  与文件所有者不同组的用户可执行

说明:将数字最后三位转化为二进制:xxx xxx xxx,高位往低位依次看,第一位为1表示文件所有者可读,第二位为1表示文件所有者可写,第三位为1表示文件所有者可执行;接下来三位表示文件所有者同组成员的权限;再下来三位为不同组用户权限。

2. 驱动代码

(1)module_param.c

#include <linux/init.h>
/*包含初始化宏定义的头文件,代码中的module_init和module_exit在此文件中*/
#include <linux/module.h>
/*包含初始化加载模块的头文件,代码中的MODULE_LICENSE在此头文件中*/

/*定义module_param module_param_array的头文件*/
#include <linux/moduleparam.h>
/*定义module_param module_param_array中perm的头文件*/
#include <linux/stat.h>

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]);
	}	
	printk(KERN_EMERG "Hello World enter!\n");
	/*打印信息,KERN_EMERG表示紧急信息*/
	return 0;
}

static void hello_exit(void)
{
	printk(KERN_EMERG "Hello world exit!\n");
}


module_init(hello_init);
/*初始化函数*/
module_exit(hello_exit);
/*卸载函数*/
MODULE_LICENSE("Dual BSD/GPL");
/*声明是开源的,没有内核版本限制*/
MODULE_AUTHOR("iTOPEET_dz");
/*声明作者*/

(2)Makefile

#!/bin/bash
#通知编译器我们要编译模块的哪些源码
#这里是编译itop4412_hello.c这个文件编译成中间文件mini_linux_module.o
obj-m += module_param.o 

#源码目录变量,这里用户需要根据实际情况选择路径
#作者是将Linux的源码拷贝到目录/home/topeet/android4.0下并解压的
KDIR := /home/topeet/iTop4412_Kernel_3.0

#当前目录变量
PWD ?= $(shell pwd)

#make命名默认寻找第一个目标
#make -C就是指调用执行的路径
#$(KDIR)Linux源码目录,作者这里指的是/home/topeet/android4.0/iTop4412_Kernel_3.0
#$(PWD)当前目录变量
#modules要执行的操作
all:
	make -C $(KDIR) M=$(PWD) modules
		
#make clean执行的操作是删除后缀为o的文件
clean:
	rm -rf *.mod.c *.o *.order *.ko *.mod.o *.symvers

3. 驱动程序调试记录

insmod module_param.ko module_arg1=10 module_arg2=20 int_array=11,12,13,14,15,16,17,18

[root@iTOP-4412]# insmod module_param.ko module_arg1=10 module_arg2=20 int_array=11,12,13,14,15,16,17,18
[16978.039546] module_arg1 is 10!
[16978.041143] module_arg2 is 20!
[16978.044181] int_array[0] is 11!
[16978.047724] int_array[1] is 12!
[16978.050625] int_array[2] is 13!
[16978.054589] int_array[3] is 14!
[16978.056688] int_array[4] is 15!
[16978.059785] int_array[5] is 16!
[16978.062941] int_array[6] is 17!
[16978.066051] int_array[7] is 18!
[16978.069158] Hello World enter!
[root@iTOP-4412]# cd /sys/module/module_param/parameters/
[root@iTOP-4412]# ls
int_array    module_arg1  module_arg2
[root@iTOP-4412]# cat int_array 
11,12,13,14,15,16,17,18
[root@iTOP-4412]# cat module_arg1
10
[root@iTOP-4412]# cat module_arg2
20
[root@iTOP-4412]# 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

snaking616

你的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值