加载驱动的传参和符号导出(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)的主要内容,如果未能解决你的问题,请参考以下文章