diff options
| -rw-r--r-- | kernel/entry.S | 18 | ||||
| -rw-r--r-- | user/init.c | 16 | ||||
| -rw-r--r-- | user/initcode.S | 2 | 
3 files changed, 21 insertions, 15 deletions
| diff --git a/kernel/entry.S b/kernel/entry.S index 62fe1f2..b72ddbc 100644 --- a/kernel/entry.S +++ b/kernel/entry.S @@ -1,14 +1,8 @@ -	# qemu -kernel starts at 0x1000. the instructions -        # there seem to be provided by qemu, as if it -        # were a ROM. the code at 0x1000 jumps to -        # 0x80000000, the _start function here, -        # in machine mode. each CPU starts here. -.section .data -.globl stack0 +	# qemu -kernel loads the kernel at 0x80000000 +        # and causes each CPU to jump there. +        # kernel.ld causes the following code to +        # be placed at 0x80000000.  .section .text -.globl start -.section .text -.globl _entry  _entry:  	# set up a stack for C.          # stack0 is declared in start.c, @@ -22,5 +16,5 @@ _entry:          add sp, sp, a0  	# jump to start() in start.c          call start -junk: -        j junk +spin: +        j spin diff --git a/user/init.c b/user/init.c index 5df6deb..13764ca 100644 --- a/user/init.c +++ b/user/init.c @@ -31,8 +31,20 @@ main(void)        printf("init: exec sh failed\n");        exit(1);      } -    while((wpid=wait(0)) >= 0 && wpid != pid){ -      //printf("zombie!\n"); + +    for(;;){ +      // this call to wait() returns if the shell exits, +      // or if a parentless process exits. +      wpid = wait((int *) 0); +      if(wpid == pid){ +        // the shell exited; restart it. +        break; +      } else if(wpid < 0){ +        printf("init: wait returned an error\n"); +        exit(1); +      } else { +        // it was a parentless process; do nothing. +      }      }    }  } diff --git a/user/initcode.S b/user/initcode.S index ca76972..e8f7a91 100644 --- a/user/initcode.S +++ b/user/initcode.S @@ -1,4 +1,4 @@ -# Initial process execs /init. +# Initial process that execs /init.  # This code runs in user space.  #include "syscall.h" | 
