Advertisement
Guest User

Untitled

a guest
Feb 19th, 2020
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 0.95 KB | None | 0 0
  1. allocproc(void)
  2. {
  3.     struct proc *p;
  4.     char *sp;
  5.    
  6.     acquire(&ptable.lock);
  7.     for(p = ptable.proc; p < &ptable.proc[NPROC]; p++)
  8.         if(p->state == UNUSED)
  9.             goto found;
  10.  
  11.     return 0;
  12.    
  13. found:
  14.     p->state = EMBRYO;
  15.     p->pid = nextpid++;
  16.     p->queue = 1;
  17.     p->runTime = 0;
  18.     q1[++n1] = p;
  19.    
  20.     release(&ptable.lock);
  21.    
  22.     // Allocate kernel stack.
  23.     if((p->kstack = kalloc()) == 0){
  24.         p->state = UNUSED;
  25.         return 0;
  26.     }
  27.     sp = p->kstack + KSTACKSIZE;
  28.    
  29.     // Leave room for trap frame.
  30.     sp -= sizeof *p->tf;
  31.     p->tf = (struct trapframe*)sp;
  32.    
  33.     // Set up new context to start executing at forkret,
  34.     // which returns to trapret.
  35.     sp -= 4;
  36.     *(uint*)sp = (uint)trapret;
  37.    
  38.     sp -= sizeof *p->context;
  39.     p->context = (struct context*)sp;
  40.     memset(p->context, 0, sizeof *p->context);
  41.     p->context->eip = (uint)forkret;
  42.    
  43.     return p;
  44. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement