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

그리고 segfaults가 발생했습니다. 아마도 잠금을 해제하기 전에 해제 할 수 없기 때문에 아마도 생각 했었습니다. 그래서 더 큰 코드 섹션에 표시된 것과 같이 뮤텍스 잠금을 맨 위에 놓았습니다. 그냥 "살해"라고 말합니다. 내가 뭘 잘못하고 있니?

+0

성취하고자하는 바가 무엇인지 설명해 주시겠습니까? 나는'struct module' 인스턴스를 수동으로 생성 할 필요가 없다고 생각합니다. 그렇다고하더라도 새로 할당되고 아직 초기화되지 않은'struct module'에서'find_symbol()'을 호출하면 커널이 최상의 결과를 낼 수 있습니다. 아마, 당신이 보았던 것일 수도 있습니다 (사용자 공간 프로세스에 대해 "Killed", 시스템 로그에 oops 보고서가 있어야합니다). – Eugene

답변

1

죄송합니다.

코드를 보면 내가 말할 수 있습니다.

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

상수에 지정합니다. 오류가 발생할 수 있습니다.

하지만 그렇지 않으면 오류를 게시 할 수 있습니다.

관련 문제