// Set up first user process. void userinit(void) { struct proc *p; extern uchar _binary_initcode_start[], _binary_initcode_size[]; p = copyproc(0); p->sz = PAGE; p->mem = kalloc(p->sz); p->cwd = namei("/"); memset(p->tf, 0, sizeof(*p->tf)); p->tf->cs = (SEG_UCODE << 3) | DPL_USER; p->tf->ds = (SEG_UDATA << 3) | DPL_USER; p->tf->es = p->tf->ds; p->tf->ss = p->tf->ds; p->tf->eflags = FL_IF; p->tf->esp = p->sz; // Make return address readable; needed for some gcc. p->tf->esp -= 4; *(uint*)(p->mem + p->tf->esp) = 0xefefefef; // On entry to user space, start executing at beginning of initcode.S. p->tf->eip = 0; memmove(p->mem, _binary_initcode_start, (int)_binary_initcode_size); safestrcpy(p->name, "initcode", sizeof(p->name)); #ifdef LOTTERY p->tickets = INIT_TICKETS; #endif p->state = UNUSED; setstate(p, RUNNABLE); initproc = p; }
int sys_fork(void) { int pid; struct proc *np; if((np = copyproc(cp)) == 0) return -1; pid = np->pid; np->state = RUNNABLE; return pid; }
int sys_fork(void) { int pid; struct proc *np; if((np = copyproc(cp)) == 0) return -1; pid = np->pid; #ifdef LOTTERY np->tickets = NEW_PROC_TICKETS; #endif setstate(np, RUNNABLE); return pid; }
int sys_fork(void) { int pid; struct proc *np; if((np = copyproc(cp)) == 0){ cprintf("sysfork failed here\n"); return -1; } acquire(&(cpus[cpu()].rq->rq_lock)); pid = np->pid; np->state = RUNNABLE; enqueue_proc(cpus[cpu()].rq, np); release(&(cpus[cpu()].rq->rq_lock)); return pid; }