Memory management 在内核模块上使用kfree

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

下午好-

第一次使用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 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报告)。