1

こんばんは SO-

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;

その結果、セグメンテーション違反が発生しました。ロックを解除する前に解放できないからかもしれないと思ったので、先に進んでミューテックスのロック解除を一番上に置きました(より大きなコードセクションに示されているように)、それは単に「殺された」と言っています。私は間違って何をしていますか?

4

1 に答える 1

1

返事が遅れて申し訳ありません。

あなたのコードを見て、私はそれを言うことができます。

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

定数に割り当てています。エラーが発生する可能性があります。

しかし、それ以外の場合は、エラーを投稿できます。

于 2013-02-22T10:59:02.163 に答える