我们要给驱动模块传参数,想必大家都很清楚,应该使用module_param()函数。近期看代码突然有个疑问,给driver传多个相同类型的参数,驱动时如何接收的呢?
insmod xxx.ko param //这种命令行中的参数又是如何与驱动中的module_param()中的参数匹配的呢?
今天我们就探讨一下module_param()与脚本中的命令参数的匹配规则
带着问题,我们实现如下代码进行验证:
源文件:
multi_params.c
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
unsigned long param1 = 0;
unsigned long param2 = 0;
module_param(param1, ulong, 0644);
module_param(param2, ulong, 0644);
static int __init multi_params_test_init()
{
printk("param1: %l, param2: %l", param1, param2);
}
static void __exit multi_param_test_exit()
{
}
module_init(multi_params_test_init);
module_exit(multi_params_test_exit);
MODULE_LICENSE("GPL")
Makefile
objs-m := multi_params.o
module-objs := multi_params.o
KDIR := /lib/module/$(shell uname -r)/build/
default:
$(MAKE) -C $(KDIR) M=$(shell pwd) modules
clean:
rm -rf *.o
rm -rf *.order
rm -rf *.mod
rm -rf *.symvers
做如下试验:
insmod a=10 b=20 //报:Unknown symbol in module,可知在driver中无法找到对应的symbol
insmod param1=10 param2=20 //可以正常insmod了,通过cat /sys/module/multi_params/parameters/param1 可知param1 = 10, param2 = 20
insmod param2=10 param1=20 // 使用这种方式验证,可以得到param1=20 param2=10
因此,根据上述的实验,我们可以得到一个结论,module_param()与脚本中的命令参数的匹配规则是,通过参数的名字进行匹配的。
2020-04-20
小石头 于济南