Memory management 在内核模块上使用kfree
下午好- 第一次使用kmallocs和kfrees时,我遇到了错误Memory management 在内核模块上使用kfree,memory-management,kernel,kernel-module,Memory Management,Kernel,Kernel Module,下午好- 第一次使用kmallocs和kfrees时,我遇到了错误 struct module* mod; const struct kernel_symbol* ksymbol; ksymbol = kmalloc(sizeof(struct kernel_symbol), GFP_KERNEL); if(!sym | !dst | (dst_sz <= 0)) return -EFAULT; mutex_lock(&module_mutex); mod = (struct
struct module* mod;
const struct kernel_symbol* ksymbol;
ksymbol = kmalloc(sizeof(struct kernel_symbol), GFP_KERNEL);
if(!sym | !dst | (dst_sz <= 0)) return -EFAULT;
mutex_lock(&module_mutex);
mod = (struct module*)kmalloc(sizeof(struct module), GFP_KERNEL);
ksymbol = find_symbol(sym, &mod, NULL, true, false);
if(!mod){
for(i = 0; i < dst_sz; i++) dst[i] = '\0';
mutex_unlock(&module_mutex);
kfree(ksymbol);
kfree(mod);
return SUCCESS;
}
这导致了断层。我想这可能是因为我无法在解锁前释放,所以我继续在顶部放置互斥解锁(如较大的代码部分所示),上面只显示“已杀死”。我做错了什么?很抱歉回复晚了
从你的代码来看,我可以这么说
ksymbol = find_symbol(sym, &mod, NULL, true, false);
您正在指定一个常数。这可能会导致错误
但是,你可以发布错误 很抱歉没有及时回复
从你的代码来看,我可以这么说
ksymbol = find_symbol(sym, &mod, NULL, true, false);
您正在指定一个常数。这可能会导致错误
但是,你可以发布错误 你能解释一下你想完成什么吗?我认为实际上没有必要手动创建
struct module
实例。即使是这样,对新分配且尚未初始化的结构模块调用find_symbol()
最多也可能导致内核oops。也许,这就是您所看到的(对于用户空间进程而言,“已终止”,在系统日志中还应该有一个oops报告)。您能解释一下您希望实现什么吗?我认为实际上没有必要手动创建struct module
实例。即使是这样,对新分配且尚未初始化的结构模块调用find_symbol()
最多也可能导致内核oops。也许,这就是您所看到的(对于用户空间进程(“Killed”),系统日志中还应该有一个oops报告)。