summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/entry.S18
-rw-r--r--user/init.c16
-rw-r--r--user/initcode.S2
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"