1
下午好SO-在內核模塊上使用kfree
第一次使用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;
而這導致段錯誤。我想也許是因爲我解鎖之前無法釋放,所以我繼續前進,並將互斥體解鎖到頂部(如較大的代碼部分所示),並且只是說「已殺死」。我做錯了什麼?
你能解釋一下你想完成什麼?我想這不是真的需要手動創建'struct module'實例。即使是這樣,在新分配的未初始化的struct模塊上調用find_symbol()也可能導致內核糟糕。也許,它是你所看到的(對於用戶空間進程「被殺死」,在系統日誌中也應該有一個oops報告)。 – Eugene