🔥博客主页:PannLZ
🎋系列专栏:《Linux系统之路》
🥊不要让自己再留有遗憾,加油吧!
模块参数
像用户程序一样,内核模块也可以接受命令行参数。首先应该声明用于保存命令行参数值的变量,并在每个变量上使用module_param()
宏。该宏在include/linux/moduleparam.h
(这也应该包含在代码中:#include <linux/moduleparam.h>
)中这样定义:
module_param(name, type, perm);
module_param(name, type, perm);
module_param_array(name, type, num_point, perm);
module_param_named(name_out, name_in, type, perm);
module_param_string(name, string, len, perm);
MODULE_PARM_DESC(name, describe);
宏包含以下元素:
name:用作参数的变量的名称。
type:参数的类型(bool、charp、byte、short、ushort、int、uint、long、ulong),其中charp代表字符指针。
perm:代表/sys/module//parameters/文件的权限,其中包括S_IWUSR、S_IRUSR、S_IXUSR、S_IRGRP、S_WGRP和S_IRUGO。
·S_I:只是一个前缀。
·R:读。W:写。X:执行。
·USR:用户。GRP:组。UGO:用户、组和其他。
当使用模块参数时,应该用MODULE_PARM_DESC
描述每个参数。这个宏将把每个参数的描述填充到模块信息部分。
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/moduleparam.h>static char *mystr = "hello";
static int myint = 1;
static int myarr[3] = {0, 1, 2};module_param(myint, int, S_IRUGO);
module_param(mystr, charp, S_IRUGO);
module_param_array(myarr, int,NULL, S_IWUSR|S_IRUSR);MODULE_PARM_DESC(myint,"this is my int variable");
MODULE_PARM_DESC(mystr,"this is my char pointer variable");
MODULE_PARM_DESC(myarr,"this is my array of int");
MODULE_INFO(my_field_name, "What eeasy value");static int __init hellowolrd_init(void) {pr_info("Hello world with parameters!\n");pr_info("The *mystr* parameter: %s\n", mystr);pr_info("The *myint* parameter: %d\n", myint);pr_info("The *myarr* parameter: %d, %d, %d\n", myarr[0], myarr[1], myarr[2]);return 0;
}static void __exit hellowolrd_exit(void) {pr_info("End of the world\n");
}module_init(hellowolrd_init);
module_exit(hellowolrd_exit);
MODULE_AUTHOR("John Madieu <john.madieu@gmail.com>");
MODULE_LICENSE("GPL");
insmod hellomodule-params.ko mystr="packtpub" myint=15 myarr=1,2,3
#加载命令
查看参数信息
demsg查看
查看sysfs目录下的本模块参数信息
动态修改
(因为我的mystr权限为只读,所以这里无法修改)
补充:
modprobe命令装载模块时可以从它的配置文件
/etc/modprobe.conf
文件中读取参数值