2012-10-06 82 views
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; 

而這導致段錯誤。我想也許是因爲我解鎖之前無法釋放,所以我繼續前進,並將互斥體解鎖到頂部(如較大的代碼部分所示),並且只是說「已殺死」。我做錯了什麼?

+0

你能解釋一下你想完成什麼?我想這不是真的需要手動創建'struct module'實例。即使是這樣,在新分配的未初始化的struct模塊上調用find_symbol()也可能導致內核糟糕。也許,它是你所看到的(對於用戶空間進程「被殺死」,在系統日誌中也應該有一個oops報告)。 – Eugene

回答

1

對不起,延遲迴復。

從查看你的代碼我可以這麼說。

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

您正在分配一個常量。這可能會導致錯誤。

但是否則你可以發佈錯誤。