Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- allocproc(void)
- {
- struct proc *p;
- char *sp;
- acquire(&ptable.lock);
- for(p = ptable.proc; p < &ptable.proc[NPROC]; p++)
- if(p->state == UNUSED)
- goto found;
- return 0;
- found:
- p->state = EMBRYO;
- p->pid = nextpid++;
- p->queue = 1;
- p->runTime = 0;
- q1[++n1] = p;
- release(&ptable.lock);
- // Allocate kernel stack.
- if((p->kstack = kalloc()) == 0){
- p->state = UNUSED;
- return 0;
- }
- sp = p->kstack + KSTACKSIZE;
- // Leave room for trap frame.
- sp -= sizeof *p->tf;
- p->tf = (struct trapframe*)sp;
- // Set up new context to start executing at forkret,
- // which returns to trapret.
- sp -= 4;
- *(uint*)sp = (uint)trapret;
- sp -= sizeof *p->context;
- p->context = (struct context*)sp;
- memset(p->context, 0, sizeof *p->context);
- p->context->eip = (uint)forkret;
- return p;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement