diff --git a/Notes b/Notes index 1a2ad2e8a45aacf5f7c9cba40c74ab1865c77855..0399f5c5079cf271588b4318f4812e42baf0fbd8 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 eca5e9759b891e78828bce394c7f22c58f8e5bed..401188e0c9fd6e3f97054a5b12f9bc596889d609 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 36b07a54087e41705433f795e948a9506ed5f625..419eaba59c508f8e7b2af93ee23b49ecc60af8dd 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