linux param用法,Linux之module_param()函数学习

一.module_param

1.为什么引入

在用户态下编程可以通过main()来传递命令行参数,而编写一个内核模块则可通过module_param()来传递命令行参数.

2. module_param宏是Linux 2.6内核中新增的,该宏被定义在include/linux/moduleparam.h文件中,具体定义如下:

/* Helper functions: type is byte, short, ushort, int, uint, long,

ulong, charp, bool or invbool, or XXX if you define param_get_XXX,

param_set_XXX and param_check_XXX.

*/

#define module_param_named(name, value, type, perm)

param_check_##type(name, &(value));

module_param_call(name, param_set_##type, param_get_##type, &value, perm);

__MODULE_PARM_TYPE(name, #type)

#define module_param(name, type, perm)

module_param_named(name, name, type, perm)

由此可知 module_param的实现是通过module_param_named(name, name, type, perm)的。

3.module_param使用了3个参数:变量名,它的类型,以及一个权限掩码用来做一个辅助的sysfs入口。

这个宏定义应当放在任何函数之外,典型地是出现在源文件的前面。

eg: static char *whom="world"

static int    tige=1;

module_param(tiger,int,S_IRUGO);

module_param(whom,charp,S_IRUGO);

4.模块参数支持许多类型:

bool

invbool

一个布尔型( true 或者 false)值(相关的变量应当是 int 类型). invbool 类型颠倒了值, 所以真值变成 false, 反之亦然.

charp :一个字符指针值. 内存为用户提供的字串分配, 指针因此设置.

int

long

short

uint

ulong

ushort

基本的变长整型值. 以 u 开头的是无符号值.

5.数组参数, 用逗号间隔的列表提供的值, 模块加载者也支持。

声明一个数组参数, 使用:

module_param_array(name,type,num,perm);

这里 name 是你的数组的名子(也是参数名),

type 是数组元素的类型,

num 是一个整型变量,

perm 是通常的权限值.

如果数组参数在加载时设置, num 被设置成提供的数的个数. 模块加载者拒绝比数组能放下的多的值.

Tiger-John说明:

perm参数的作用是什么?

最后的 module_param 字段是一个权限值,表示此参数在sysfs文件系统中所对应的文件节点的属性。你应当使用 中定义的值. 这个值控制谁可以存取这些模块参数在 sysfs 中的表示.当perm为0时,表示此参数不存在 sysfs文件系统下对应的文件节点。 否则, 模块被加载后,在/sys/module/ 目录下将出现以此模块名命名的目录, 带有给定的权限.。

权限在include/linux/stat.h中有定义

比如:

#define S_IRWXU 00700

#define S_IRUSR 00400

#define S_IWUSR 00200

#define S_IXUSR 00100

#define S_IRWXG 00070

#define S_IRGRP 00040

#define S_IWGRP 00020

#define S_IXGRP 00010

#define S_IRWXO 00007

#define S_IROTH 00004

#define S_IWOTH 00002

#define S_IXOTH 00001

使用 S_IRUGO 参数可以被所有人读取, 但是不能改变; S_IRUGO|S_IWUSR 允许 root 来改变参数. 注意, 如果一个参数被 sysfs 修改, 你的模块看到的参数值也改变了, 但是你的模块没有任何其他的通知. 你应当不要使模块参数可写, 除非你准备好检测这个改变并且因而作出反应.

二实例:

说了这么多,看一个程序体验以下:

1.module_param.c

view plaincopy to clipboardprint?

/*

*   file name : module_param.c

*   author    : tiger-John

*/

#include

#include

#include

MODULE_LICENSE("GPL");

static char *who;

static int  times;

module_param(who,charp,0644);

module_param(times,int,0644);

static int __init hello_init(void)

{

int i;

for(i = 1;i <= times;i++)

printk("%d  %s!\n",i,who);

return 0;

}

static void __exit hello_exit(void)

{

printk("Goodbye,%s!\n",who);

}

module_init(hello_init);

module_exit(hello_exit);

/*

*   file name : module_param.c

*   author    : tiger-John

*/

#include

#include

#include

MODULE_LICENSE("GPL");

static char *who;

static int  times;

module_param(who,charp,0644);

module_param(times,int,0644);

static int __init hello_init(void)

{

int i;

for(i = 1;i <= times;i++)

printk("%d  %s!\n",i,who);

return 0;

}

static void __exit hello_exit(void)

{

printk("Goodbye,%s!\n",who);

}

module_init(hello_init);

module_exit(hello_exit);

2.编写Makefile文件

view plaincopy to clipboardprint?

1 obj-m:=module_param.o

2 CURRENT_PATH:=$(shell pwd)

3 VERSION_NUM :=$(shell uname -r)

4 LINUX_PATH  :=/usr/src/linux-headers-$(VERSION_NUM)

5

6 all :

7         make -C $(LINUX_PATH) M=$(CURRENT_PATH) modules

8 clean :

9          make -C $(LINUX_PATH) M=$(CURRENT_PATH) clean

1 obj-m:=module_param.o

2 CURRENT_PATH:=$(shell pwd)

3 VERSION_NUM :=$(shell uname -r)

4 LINUX_PATH  :=/usr/src/linux-headers-$(VERSION_NUM)

5

6 all :

7         make -C $(LINUX_PATH) M=$(CURRENT_PATH) modules

8 clean :

9          make -C $(LINUX_PATH) M=$(CURRENT_PATH) clean

3.在终端输入:make

4 .加载模块: sudo insmdo module_param.ko who=tiger times=4

5.dmesg :查看结果。

过程实例:

a.在终端输入:make

think@Ubuntu:~/module_param$ make

make -C /usr/src/linux-headers-2.6.32-25-generic M=/home/think/module_param modules

make[1]: 正在进入目录 `/usr/src/linux-headers-2.6.32-25-generic'

Building modules, stage 2.

MODPOST 1 modules

make[1]:正在离开目录 `/usr/src/linux-headers-2.6.32-25-generic'

think@ubuntu:~/module_param$

b.在终端输入: sudo insmod module_param.ko who=tiger times=4

think@ubuntu:~/module_param$ sudo insmod module_param.ko who=tiger times=4

c 在终端输入:dmesg

[ 4297.711137] 1  tiger!

[ 4297.711139] 2  tiger!

[ 4297.711140] 3  tiger!

[ 4297.711141] 4  tiger!0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux设备驱动程序学习(0)-Hello, world!模块 Linux设备驱动程序学习(0) -Hello, world!模块 一个学习Linux设备驱动程序都会碰到的第一个例程: #include #include MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_ALERT "Hello, Tekkaman Ninja !\n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT "Goodbye, Tekkaman Ninja !\n Love Linux !Love ARM ! Love KeKe !\n"); } module_init(hello_init); module_exit(hello_exit); 我将其复制到我的工作目录,并编写了一个简单的Makefile文件: KERNELDIR = /home/tekkaman/working/SBC2440/linux-2.6.22.2 # The current directory is passed to sub-makes as argument PWD := $(shell pwd) INSTALLDIR = /home/tekkaman/working/rootfs/lib/modules CROSS_COMPILE =/home/tekkaman/working/crosstool-gcc410-k26222/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu- CC = $(CROSS_COMPILE)gcc obj-m := hello.o modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules modules_install: cp hello.ko $(INSTALLDIR) clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions .PHONY: modules modules_install clean 说实话,以上是我参考了《Linux设备驱动程序(第3版)》的Makefile源码修改得来的。我对Makefile不是很了解,是该好好学习学习了! 然后就是make modulesmake modules_install 。 [root@Tekkaman-Ninja Helloworld]# make modules make -C /home/tekkaman/working/SBC2440/linux-2.6.22.2 M=/home/tekkaman/working/Linuxdriver/Helloworld modules make[1]: Entering directory `/home/tekkaman/working/SBC2440/linux-2.6.22.2' CC [M] /home/tekkaman/working/Linuxdriver/Helloworld/hello.o Building modules, stage 2. MODPOST 1 modules CC /home/tekkaman/working/Linuxdriver/Helloworld/hello.mod.o LD [M] /home/tekkaman/working/Linuxdriver/Helloworld/hello.ko make[1]: Leaving directory `/home/tekkaman/working/SBC2440/linux-2.6.22.2' [root@Tekkaman-Ninja Helloworld]# make modules_install cp hello.ko /home/tekkaman/working/rootfs/lib/modules [root@Tekkaman-Ninja Helloworld]# 在我的开发板上的操作: [Tekkaman2440@SBC2440V4]#cd /lib/modules/ [Tekkaman2440@SBC2440V4]#ls cs89x0.ko hello.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值