歡迎您光臨本站 註冊首頁

有一個模塊叫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 時自己填參數也是這個問題
代碼中直接傳字元串也是這個問題。

請大俠幫忙看看啊,很詭異的問題啊。謝謝謝謝!

[火星人 ] 詭異:內核模塊只能正確用兩個參數?傳第3個參數就空了已經有538次圍觀

http://coctec.com/docs/linux/show-post-183110.html