一、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写作社区