【Linux】模块参数

在这里插入图片描述

🔥博客主页: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文件中读取参数值

再补充

module_param_cb

如果在设定或读取参数时,需要进行类似通知等操作,可以使用module_param_cb,在getset时调用对应的回调函数。module_param_array和module_param调用的是默认的回调函数, module_param_cb支持自定义回调函数

示例:

static int cb_valueETX = 999;
int notify_param(const char *val, const struct kernel_param *kp)
{
        int res = param_set_int(val, kp); // Use helper for write variable
        if(res==0) {
                printk(KERN_INFO "Call back function called...\n");
                printk(KERN_INFO "New value of cb_valueETX = %d\n", cb_valueETX);
                return 0;
        }
        return -1;
}
  
const struct kernel_param_ops my_param_ops =
{
        .set = &notify_param, // Use our setter ...
        .get = &param_get_int, // .. and standard getter
};
  
module_param_cb(cb_valueETX, &my_param_ops, &cb_valueETX, S_IRUGO|S_IWUSR );
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值