Linux module参数传递

一、Linux Module参数传递

        在C 语言中,可以在main函数利用argc、argv获取用户的输入,Linux驱动同样可以传递参数,下面简要介绍参数宏的使用方法

        利用下面宏定义的参数可以在下面路径找到

/sys/module/xxxxx/parameters/

1、module_param() 

#define module_param(name, type, perm)				\
	module_param_named(name, name, type, perm)
name:参数名
type:参数类型
    (1)布尔类型:bool,invbool;
    (2)字符指针类型:charp;
    (3)基本整型类型:int,long,short,uint,ulong,ushort。
perm:参数权限掩码:RWX

2、module_param_array() 

        用于声明以","分隔的数组类型参数

#define module_param_array(name, type, nump, perm)		\
	module_param_array_named(name, name, type, nump, perm)

3、module_param_cb() 

        用于注册一个回调函数,当参数值改变时会被调用(例如echo新参数到sysfs),最常见的应用场景就是在模块运行期间动态修改其配置

#define module_param_cb(name, ops, arg, perm)				      \
	__module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, -1, 0)
name:参数名称
ops:一个回调函数,用于set/get
arg:参数的实际值
perm:参数访问权限,用于确认参数读写性质

        module_param_cb()接收一个 struct kernel_param_ops类型的参数作为模块参数的回调函数

struct kernel_param_ops {
  	/* How the ops should behave */
  	unsigned int flags;
  	/* Returns 0, or -errno.  arg is in kp->arg. */
  	int (*set)(const char *val, const struct kernel_param *kp);
  	/* Returns length written or -errno.  Buffer is 4k (ie. be short!) */
  	int (*get)(char *buffer, const struct kernel_param *kp);
  	/* Optional function to free kp->arg when module unloaded. */
  	void (*free)(void *arg);
};  

二、应用示例

        下面只列举 module_param_cb() 的示例,其他在参考博客[2]中查看

static bool use_mcq_mode = true;

static bool is_mcq_supported(struct ufs_hba *hba)
{
	return hba->mcq_sup && use_mcq_mode;
}

static int param_set_mcq_mode(const char *val, const struct kernel_param *kp)
{
	int ret;

	ret = param_set_bool(val, kp);
	if (ret)
		return ret;

	return 0;
}

static const struct kernel_param_ops mcq_mode_ops = {
	.set = param_set_mcq_mode,
	.get = param_get_bool,
};

module_param_cb(use_mcq_mode, &mcq_mode_ops, &use_mcq_mode, 0644);
MODULE_PARM_DESC(use_mcq_mode, "Control MCQ mode for controllers starting from UFSHCI 4.0. 1 - enable MCQ, 0 - disable MCQ. MCQ is enabled by default");

        例如,在上述示例中,use_mcq_mode是参数值,可以通过下面sysfs改变,从而使is_mcq_supported()的结果可以动态变化

        在echo时,就会调用mcq_mode_ops中的set回调,即param_set_mcq_mode()函数,在这里调用标准的 param_set_bool() 函数对参数进行设置,可以在这之前加入一些判断,类似的方法还有 param_set_uint() 等;在cat时,就会调用get回调,即param_get_bool()函数,获取参数值

#:/sys/module/ufshcd_core/parameters # cat use_mcq_mode                                                                                                                                                
Y
#:/sys/module/ufshcd_core/parameters # echo 0 > use_mcq_mode  
                                                                                                                                         
#:/sys/module/ufshcd_core/parameters # cat use_mcq_mode                                                                                                                                                
N

【参考博客】

[1] 【linux 内核传参 module_param_cb 】-CSDN博客

[2]  Linux设备驱动系列(三)——参数传递_linux开发_Linux内核拾遗_InfoQ写作社区

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值