2013-10-29 3 views
1

커널 수준에서 linux/list.h를 사용하여 링크 된 목록을 만들려고합니다. 내 코드가 컴파일되지만 링크 된 목록에 둘 이상의 노드를 추가하려고하면 커널 웁스가 발생합니다. 여기 내 커널 레벨 코드입니다 :커널 연결된 목록 커널 귀찮음

//global defs 
    struct Node { 
char *data; 
    struct list_head list; 
    }; 
    LIST_HEAD(mylinkedlist); 
    DEFINE_MUTEX(mut); 

    asmlinkage long write(const void __user *data, long len){ 
    //create new space in memory enough to fit data 
    void *ptr = kmalloc(len, GFP_KERNEL); 
    //create the user space pointer to kernel space pointer 
    int verif = copy_from_user(ptr, data, len); 
    if(verif != 0){ 
      return -EFAULT; 
    } 


    struct Node first = {ptr, LIST_HEAD_INIT(first.list)}; 
    //wait for mutex to be available 
    mutex_lock_interruptible(&mut); 
    list_add_tail(&first.list, &mylinkedlist); 
    //release the mutex 
    mutex_unlock(&mut); 

    return 0; 

내 유저 랜드 프로그램은 다음과 같습니다

long hello_syscall(void) { 
char *arg = "Hello"; 
return syscall(351, "Hello", sizeof(arg)); 
} 

그것은 모든 컴파일하지만 난 시도하고 나는이 쇼를 제공 번 이상 유저 랜드 프로그램 이상을 실행할 때 커널 오작동. https://gist.github.com/anonymous/7217210

+0

INIT_LIST_HEAD (목록)를 사용해보십시오. list_head 구조체가 어떻게 사용되는지 커널 소스에서 살펴보십시오. –

+0

또한 kmalloc에서 오류가 반환되는지 확인하십시오. 실패하면 다음 코드 행이 충돌합니다. – z242

답변

1
struct Node first = {ptr, LIST_HEAD_INIT(first.list)}; 

는 스택에 first 할당하고, 기능이 남아있는 때 사라 : 나는 그것이 발생하면 OS가 나에게주는 오류 메시지의 요점을 만들었습니다. mylinkedlist이 쓰레기를 가리키고 다음 목록 작업이 중단됩니다.

0

리눅스 커널은 대부분 C 언어로 작성됩니다. 그리고이 모양의 구조를 사용할 수 있습니다 :

struct _Node 
{ 

    char *data; 
    struct NODE* list; 

}NODE,PNODE*;