diff --git a/Notes b/Notes index 1a2ad2e..0399f5c 100644 --- a/Notes +++ b/Notes @@ -101,7 +101,6 @@ test: one process unlinks a file while another links to it test: one process opens a file while another deletes it test: deadlock d/.. vs ../d, two processes. test: dup() shared fd->off -test: sbrk test: does echo foo > x truncate x? sh: support pipes? leave it for the class? @@ -119,4 +118,5 @@ echo foo > bar should truncate bar but O_TRUNC should make it work on one cpu -make it work on amsterdam +make it work on a real machine +release before acquire at end of sleep? diff --git a/proc.c b/proc.c index eca5e97..401188e 100644 --- a/proc.c +++ b/proc.c @@ -38,8 +38,6 @@ setupsegs(struct proc *p) c->ts.esp0 = 0xffffffff; } - // XXX it may be wrong to modify the current segment table! - c->gdt[0] = SEG_NULL; c->gdt[SEG_KCODE] = SEG(STA_X|STA_R, 0, 0x100000 + 64*1024, 0); // xxx c->gdt[SEG_KDATA] = SEG(STA_W, 0, 0xffffffff, 0); @@ -96,7 +94,7 @@ copyproc(struct proc* p) np->ppid = p->pid; release(&proc_table_lock); - // Copy process image memory. + // Copy user memory. np->sz = p->sz; np->mem = kalloc(np->sz); if(np->mem == 0){ @@ -214,18 +212,16 @@ sched(void) void yield(void) { - struct proc *p; + struct proc *p = curproc[cpu()]; - if((p=curproc[cpu()]) == 0 || curproc[cpu()]->state != RUNNING) - panic("yield"); acquire(&proc_table_lock); p->state = RUNNABLE; sched(); release(&proc_table_lock); } -// A process's very first scheduling by scheduler() -// will longjmp here to do the first jump into user space. +// A fork child's very first scheduling by scheduler() +// will longjmp here. "return" to user space. void forkret(void) { @@ -371,7 +367,7 @@ proc_wait(void) acquire(&proc_table_lock); for(;;){ - // Scan through table looking zombie children. + // Scan through table looking for zombie children. havekids = 0; for(i = 0; i < NPROC; i++){ p = &proc[i]; diff --git a/proc.h b/proc.h index 36b07a5..419eaba 100644 --- a/proc.h +++ b/proc.h @@ -36,9 +36,9 @@ struct jmpbuf { enum proc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE }; struct proc{ - char *mem; // start of process's physical memory - uint sz; // total size of mem, including kernel stack - char *kstack; // kernel stack, separate from mem so it doesn't move + char *mem; // start of process's memory (a kernel address) + uint sz; // user memory size + char *kstack; // kernel stack enum proc_state state; int pid; int ppid; @@ -52,7 +52,6 @@ struct proc{ extern struct proc proc[]; extern struct proc *curproc[NCPU]; // can be NULL if no proc running. - // XXX move curproc into cpu structure? #define MPSTACK 512