2016-11-16 3 views
1

При попытке проверить мой клон системный вызов (код ниже), я получаю следующие ошибки:Как реализовать клон для потоков на уровне ядра в xv6

pid 4 thread_test: trap 13 err 0 on cpu 1 eip 0xc54 addr 0x0--kill proc pid 5 thread_test: trap 14 err 4 on cpu 1 eip 0x0 addr 0x28ec83e5--kill proc

, которые соответствуют общей ошибке защиты и ошибка страницы. Кто-нибудь знает, что может привести к тому, что новые потоки будут убиты сразу после создания?

int clone(void *(*func) (void *), void *arg, void *stack) 
{ 
    int i,pid; 
    struct proc *np; 

    // Allocate process. 
    if((np = allocproc()) == 0) 
    return -1; 

    np->state = UNUSED; 
    np->sz = proc->sz; 
    np->parent = proc; 
    *np->tf = *proc->tf; 
    np->pgdir = proc->pgdir; 

    np->tf->eax = 0; // Clear %eax so that fork returns 0 in the child. 
    np->tf->eip = (int)func; //change eip to new function 
    np->kstack = stack; //use given stack 

    for(i = 0; i < NOFILE; i++) 
    if(proc->ofile[i]) 
     np->ofile[i] = filedup(proc->ofile[i]); 
    np->cwd = idup(proc->cwd); 

    np->tf->esp = (uint)(stack+PGSIZE-4); //put esp to right spot on stack 
    *((uint*)(np->tf->esp)) = (uint)arg; //arg to function 
    *((uint*)(np->tf->esp)-4) = 0xFFFFFFFF; //return to nowhere 
    np->tf->esp =(np->tf->esp) -4; 

    safestrcpy(np->name, proc->name, sizeof(proc->name)); 
    pid = np->pid; 

    acquire(&ptable.lock); //lock so writes last 
    np->state = RUNNABLE; 
    release(&ptable.lock); 

    return pid; 
} 

ответ

0

Я нашел решение, я пытался использовать пройденный в стеке как kstack потока. Мне нужно создать отдельный стек в proc.h, а затем присвоить стеку нить с помощью:

np->stack = (int)stack;

 Смежные вопросы

  • Нет связанных вопросов^_^