This commit is contained in:
rtm 2006-08-29 21:35:30 +00:00
parent 7a37578e9e
commit 18432ed5ed
3 changed files with 10 additions and 15 deletions

4
Notes
View file

@ -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: one process opens a file while another deletes it
test: deadlock d/.. vs ../d, two processes. test: deadlock d/.. vs ../d, two processes.
test: dup() shared fd->off test: dup() shared fd->off
test: sbrk
test: does echo foo > x truncate x? test: does echo foo > x truncate x?
sh: support pipes? leave it for the class? sh: support pipes? leave it for the class?
@ -119,4 +118,5 @@ echo foo > bar should truncate bar
but O_TRUNC should but O_TRUNC should
make it work on one cpu 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?

14
proc.c
View file

@ -38,8 +38,6 @@ setupsegs(struct proc *p)
c->ts.esp0 = 0xffffffff; c->ts.esp0 = 0xffffffff;
} }
// XXX it may be wrong to modify the current segment table!
c->gdt[0] = SEG_NULL; c->gdt[0] = SEG_NULL;
c->gdt[SEG_KCODE] = SEG(STA_X|STA_R, 0, 0x100000 + 64*1024, 0); // xxx 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); c->gdt[SEG_KDATA] = SEG(STA_W, 0, 0xffffffff, 0);
@ -96,7 +94,7 @@ copyproc(struct proc* p)
np->ppid = p->pid; np->ppid = p->pid;
release(&proc_table_lock); release(&proc_table_lock);
// Copy process image memory. // Copy user memory.
np->sz = p->sz; np->sz = p->sz;
np->mem = kalloc(np->sz); np->mem = kalloc(np->sz);
if(np->mem == 0){ if(np->mem == 0){
@ -214,18 +212,16 @@ sched(void)
void void
yield(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); acquire(&proc_table_lock);
p->state = RUNNABLE; p->state = RUNNABLE;
sched(); sched();
release(&proc_table_lock); release(&proc_table_lock);
} }
// A process's very first scheduling by scheduler() // A fork child's very first scheduling by scheduler()
// will longjmp here to do the first jump into user space. // will longjmp here. "return" to user space.
void void
forkret(void) forkret(void)
{ {
@ -371,7 +367,7 @@ proc_wait(void)
acquire(&proc_table_lock); acquire(&proc_table_lock);
for(;;){ for(;;){
// Scan through table looking zombie children. // Scan through table looking for zombie children.
havekids = 0; havekids = 0;
for(i = 0; i < NPROC; i++){ for(i = 0; i < NPROC; i++){
p = &proc[i]; p = &proc[i];

7
proc.h
View file

@ -36,9 +36,9 @@ struct jmpbuf {
enum proc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE }; enum proc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };
struct proc{ struct proc{
char *mem; // start of process's physical memory char *mem; // start of process's memory (a kernel address)
uint sz; // total size of mem, including kernel stack uint sz; // user memory size
char *kstack; // kernel stack, separate from mem so it doesn't move char *kstack; // kernel stack
enum proc_state state; enum proc_state state;
int pid; int pid;
int ppid; int ppid;
@ -52,7 +52,6 @@ struct proc{
extern struct proc proc[]; extern struct proc proc[];
extern struct proc *curproc[NCPU]; // can be NULL if no proc running. extern struct proc *curproc[NCPU]; // can be NULL if no proc running.
// XXX move curproc into cpu structure?
#define MPSTACK 512 #define MPSTACK 512