【问题标题】:Using kfree on kernel modules在内核模块上使用 kfree
【发布时间】:2012-09-27 14:51:12
【问题描述】:

下午好-

第一次使用 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;
}

我还有其他情况(!mod 用于将模块内置到内核中),但为什么会产生错误?起初我有...

  kfree(ksymbol);
  kfree(mod);
  mutex_unlock(&module_mutex);
  return SUCCESS;

这导致了段错误。我想可能是因为我在解锁之前无法释放,所以我继续将互斥锁解锁放在顶部(如更大的代码部分所示),这只是说“Killed”。我做错了什么?

【问题讨论】:

  • 你能解释一下你想完成什么吗?我想实际上没有必要手动创建 struct module 实例。即使是这样,在新分配且尚未初始化的 struct module 上调用 find_symbol() 最多可能会导致内核 oops。也许,这就是您所看到的(用户空间进程的“已终止”,系统日志中还应该有一个 oops 报告)。

标签: memory-management kernel kernel-module


【解决方案1】:

抱歉回复晚了。

通过查看您的代码,我可以这么说。

ksymbol = find_symbol(sym, &mod, NULL, true, false);

您正在分配一个常量。这可能会导致错误。

但否则你可以发布错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2018-08-07
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    相关资源
    最近更新 更多