加载驱动的传参和符号导出(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许可证下的模块使用;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值