以下代码在我的一个linux内核模块中失败
printk("This module: %p\n",THIS_MODULE);
DEBUG_USE_COUNT(p);
printk("This module refcount: %d\n", module_refcount(THIS_MODULE));
DEBUG_USE_COUNT(p);
if (!try_module_get(THIS_MODULE)) {
printk_stderr("can't get module\n");
return -EFAULT;
}
代码本身在通常的环境中工作,但是当我尝试在另一个模块中调用的函数中执行它时,它会因为分页错误而失败。 (在初始化期间,另一个模块传递指向有问题的函数的指针) 任何想法为什么模块不能增加从另一个模块调用的引用计数? 是否有适用于try_get_module调用的特殊限制?
[ 7888.065029] BUG: unable to handle kernel paging request at fa69206
8
[ 7888.067470] IP: [<f926a2b6>] _ZL18open_station_sharePKcP23__camac_
kernel_open_argP4file+0x84/0x8ec [camac_k0607_lsi6] //function in question, calling try_module_get()
[ 7888.069014] Call Trace:
[ 7888.069014] [<c10ac2b7>] ? __kmalloc+0x104/0x110
[ 7888.069014] [<c12518f5>] ? printk+0xe/0x11
[ 7888.069014] [<f90fae79>] ? T.633+0x46/0x4b [camac_mx]
[ 7888.069014] [<f90fb07e>] ? camac_mx_ioctl+0x200/0x228 [camac_mx] //function of another module that calls the one in question
[ 7888.069014] [<c10ba415>] ? vfs_ioctl+0x58/0x72
[ 7888.069014] [<c10ba966>] ? do_vfs_ioctl+0x492/0x4d6
[ 7888.069014] [<c109007b>] ? shmem_parse_options+0x167/0x281
[ 7888.069014] [<c10ae69e>] ? fd_install+0x1b/0x38
[ 7888.069014] [<c10ae88b>] ? do_sys_open+0xc8/0xdd
[ 7888.069014] [<c10ba9ee>] ? sys_ioctl+0x44/0x64
[ 7888.069014] [<c100305b>] ? sysenter_do_call+0x12/0x28
如果有人解释印刷堆栈顶部的垃圾,我也会很棒。跨模块调用中不应该有任何功能。堆栈上的前三个函数对我来说毫无意义。
答案 0 :(得分:1)
如果将特定源文件编译到内核而不是作为模块的一部分,那么THIS_MODULE可能会计算为NULL,而module_refcount不喜欢获取NULL。
此外,不建议在内核模块中使用C ++,因为它可能会干扰所有内容(想想异常等等)。