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?
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?
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);
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){
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)
{
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];
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;
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