加载驱动的传参和符号导出(EXPORT_SYMBOL & module_param)

Posted 正在起飞的蜗牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加载驱动的传参和符号导出(EXPORT_SYMBOL & module_param)相关的知识,希望对你有一定的参考价值。

1、加载驱动时传参

在用insmod命令加载驱动时可以向驱动传递参数,例如insmod test.ko howmany=2,将test.ko中的howmany变量赋值为2;

2、module_param宏分析

module_param(name, type, perm);

(1)name:既是用户看到的参数名,又是模块内接受参数的变量;;
(2)type:表示参数的类型;
(3)perm:指定了在sysfs中相应文件的访问权限。(1)S_IRUGO:任何人均可读取该参数,但不能修改;(2)S_IRUGO | S_IWUSR:允许root用户修改该参数;
补充:如果一个参数通过sysfs被修改,就如同模块修改了这个参数的值,内核不会以任何方式通知模块。大多数情况下,不应该让模块参数可写,除非
模块中打算检测这种修改并作出相应的动作;

3、module_param宏用法分析

static char *whom= "world";
static int howmany=1;
module_param(howmany, int, S_IRUGO);
module_param(whom, charp, S_IRUGO); //charp代表字符指针值

假设test.ko的源码中有以上代码,则可以在加载test.ko时通过传参指定addr变量的值,例如:insmod test.ko howmany=1。

4、module_param_arry宏分析

module_param_arry(name, type, num, perm);

(1)name:数组的名称;
(2)type:表示数组元数的类型;
(3)num:指定用户提供的数组元素的个数,但是不能超过数组的大小;
(4)perm:指定了在sysfs中相应文件的访问权限。(1)S_IRUGO:任何人均可读取该参数,但不能修改;(2)S_IRUGO | S_IWUSR:允许root用户修改该参数;
总结:这是对数组传参时使用的。

5、导出符号到内核

EXPORT_SYMBOL(name);
EXPORT_SYMBOL_GPL(name);

(1)导出到内核的符号可以被内核中其他模块使用,比如在a.ko驱动中实现test()函数,可以通过EXPORT_SYMBOL(test)将test导出到内核,然后在b.ko中调用
test函数,但是要注意模块的加载顺序,在上面的情况下必须保证a.ko比b.ko先加载;
(2)EXPORT_SYMBOL(name):导出单个符号name到内核;
(3)EXPORT_SYMBOL_GPL(name):导出的符号只能被GPL许可证下的模块使用;

以上是关于加载驱动的传参和符号导出(EXPORT_SYMBOL & module_param)的主要内容,如果未能解决你的问题,请参考以下文章

构造方法和方法重载 this关键字 方法的传参和递归调用

VUE--query 方式传参和接收参数

实参和形参

insmod命令加载驱动详解

微信小程序的传参

C语言指针就应该这么学 - 指针的进阶篇