免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1398 | 回复: 3
打印 上一主题 下一主题

[内核模块] 诡异:内核模块只能正确用两个参数?传第3个参数就空了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-15 18:48 |只看该作者 |倒序浏览
本帖最后由 krocp 于 2013-01-15 18:57 编辑

有一个模块叫GCI.ko,它export出来三个GCIReg、GCIStatNew、GCICtlNew函数
原型分别是
GCIHandle *GCIReg(char *moduleName)
GCICtlHandle *GCICtlNew(GCIHandle *moduleHandle, char *ctlFileName, GCICtlCmd *cmdTable, void *privData)
GCIStatHandle *GCIStatNew(GCIHandle *moduleHandle, char *statFileName, GCIStatDesc *descTable)

现在在Ipdb模块里调用它们
首先声明三个模块参数
  26 static char *mod_name = "IPDB";
  27 static char *ctl_file_name = "Control";
  28 static char *stat_file_name = "Stat";

  29 static void * cm_get_net_entity = CMGetNetEntity;  
      
1598 module_param(mod_name, charp, S_IRUGO);
1599 module_param(ctl_file_name, charp, S_IRUGO);
1600 module_param(stat_file_name, charp, S_IRUGO);
1601 module_param(cm_get_net_entity, charp, S_IRUGO);

module_init(IPDB_init_module) 里的代码片段
106         GuardNotify(mod_name, GUARD_LOG_ERROR, NOPKT,
107                         "before GCIReg (0x%x:%s)\n",
108                         mod_name, mod_name);
109         GCI_h = GCIReg(mod_name);

116
117         GuardNotify(mod_name, GUARD_LOG_ERROR, NOPKT,
118                         "before GCICtlNew (0x%x: %s) %s \n",
119                         ctl_file_name, ctl_file_name, mod_name);
120         GCI_Ctl_h  = GCICtlNew(GCI_h, ctl_file_name, cmds, NULL);

122         GuardNotify(mod_name, GUARD_LOG_ERROR, NOPKT,
123                         "before GCIStatNew (0x%x: %s) %s\n",
124                         stat_file_name, stat_file_name, mod_name);
125         GCI_Stat_h = GCIStatNew(GCI_h, stat_file_name, statDesc) ;

insmod时,模块被kill,dmesg打印出来的信息如下:
[  350.756636] <1>GUARD ERR IPDB PKT ffffffff: before GCIReg (0xf7ffb924:IPDB)
[  350.756641] <1>GUARD ERR GCI PKT ffffffff: registering GCIReg (0xf7ffb924:IPDB)
[  350.756651] <1>GUARD ERR IPDB PKT ffffffff: before GCICtlNew (0xf7ffb929: Control) IPDB
[  350.756654] <1>GUARD DBG GCI PKT ffffffff: creating ctl file (0xf7ffb929: Control) for module IPDB
[  350.756657] <1>GUARD ERR IPDB PKT ffffffff: before GCIStatNew (0xf7ffb973: Stat) IPDB
[  350.756660] <1>GUARD DBG GCI PKT ffffffff: creating stat file (0x46: (null)) for module IPDB
[  350.756670] BUG: unable to handle kernel NULL pointer dereference at 00000046


如果把GCIStatNew挪到GCICtlNew前边调用,insmod时,模块被kill,dmesg打印出来的信息如下:
[  170.913746] <1>GUARD ERR IPDB PKT ffffffff: before GCIReg (0xf807b924:IPDB)
[  170.913751] <1>GUARD ERR GCI PKT ffffffff: registering GCIReg (0xf807b924:IPDB)
[  170.913757] <1>GUARD ERR IPDB PKT ffffffff: before GCIStatNew (0xf807b929: Stat) IPDB
[  170.913760] <1>GUARD DBG GCI PKT ffffffff: creating stat file (0xf807b929: Stat) for module IPDB
[  170.913764] <1>GUARD ERR IPDB PKT ffffffff: before GCICtlNew (0xf807b947: Control) IPDB
[  170.913767] <1>GUARD DBG GCI PKT ffffffff: creating ctl file (0x46: (null)) for module IPDB
[  170.913776] BUG: unable to handle kernel NULL pointer dereference at 00000046

就是说传入前两个参数都是对的,传入第三个参数时,传入为空,传进去后它地址就变成0x46:
上网查,说是一个模块能传入30个参数,有的人说能传入70个参数,我这个问题是只能传两个参数
同样的我在insmod 时自己填参数也是这个问题
代码中直接传字符串也是这个问题。

请大侠帮忙看看啊,很诡异的问题啊。谢谢谢谢!

论坛徽章:
0
2 [报告]
发表于 2013-01-16 09:56 |只看该作者
你这不是写了第四个参数么
1601 module_param(cm_get_net_entity, charp, S_IRUGO);

这个cm_get_net_entity 应该填个字符串指针,你都写的什么?

论坛徽章:
0
3 [报告]
发表于 2013-01-16 11:26 |只看该作者
这个是函数指针。也用了,在后边,没有写上。
我遇到的问题是到第三个就处理不了了。

回复 2# hmsghnh


   

论坛徽章:
0
4 [报告]
发表于 2013-01-18 15:57 |只看该作者
是不是cmds这个指针有问题,或者指向的内容有问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP