I've added fork() to a7out after adding some comments to src/cmd/init.s.

There is a test program to demonstrate fork working.
This commit is contained in:
Warren Toomey
2016-03-03 09:23:48 +10:00
parent 644bee06a0
commit 6547aa98be
3 changed files with 105 additions and 62 deletions
+38 -37
View File
@@ -2,46 +2,46 @@
-1
sys intrp
jms init1
jms init2
jms init1 " Fork the first child connected to ttyin/ttyout
jms init2 " Fork the second child connected to keyboard/display
1:
sys rmes
sys rmes " Wait for a child to exit
sad pid1
jmp 1f
jmp 1f " It was child 1, so jump to 1f and restart it
sad pid2
jms init2
jmp 1
jms init2 " It was child 2, so restart it
jmp 1 " and loop back. XXX: weird use of 1: not 1b. I don't like it!
1:
jms init1
jmp 1
jmp 1 " Weird use of 1: not 1b. I don't like it!
init1: 0
sys fork
sys fork " Fork a child process
jmp 1f
sys open; ttyin; 0
sys open; ttyout; 1
jmp login
sys open; ttyin; 0 " which opens the ttyin
sys open; ttyout; 1 " and ttyout files, and
jmp login " waits for a user to log in
1:
dac pid1
jmp init1 i
dac pid1 " Parent stores childs pid in pid1
jmp init1 i " and returns
init2: 0
sys fork
sys fork " Fork a child process
jmp 1f
sys open; keybd; 0
sys open; displ; 1
jmp login
sys open; keybd; 0 " which opens the keyboard
sys open; displ; 1 " and display files, and
jmp login " waits for a user to log in
1:
dac pid2
jmp init2 i
dac pid2 " Parent stores childs pid in pid2
jmp init2 i " and returns
login:
-1
sys intrp
sys open; password; 0
sys open; password; 0 " Open the passwd file
lac d1
sys write; m1; m1s
jms rline
sys write; m1; m1s " Write "\nlogin:" on the terminal
jms rline " and read the user's username
lac ebufp
dac tal
1:
@@ -67,8 +67,8 @@ login:
tad 9
dac 9
lac d1
sys write; m3; m3s
jms rline
sys write; m3; m3s " Write "password: " on the terminal
jms rline " and read the user's password
law ibuf-1
dac 8
2:
@@ -123,13 +123,13 @@ login:
jmp 1b
2:
lac nchar
sys setuid
sys chdir; dd
sys setuid " Set the user's user-id
sys chdir; dd " and change into the "dd" directory
sys chdir; dir
lac d2
lac d2 " Close file descriptor 2
sys close
sys open; sh; 0
sys open; sh; 0 " Open the shell executable file (we get fd 2)
sma
jmp 1f
sys link; system; sh; sh
@@ -140,25 +140,26 @@ login:
jmp error
sys unlink; sh
1:
law 017700
dac 9
law 017700 " Copy the code at the boot label below
dac 9 " up to location 017700
law boot-1
dac 8
1:
lac 8 i
dac 9 i
sza
sza " Stop copying when we hit the 0 marker
jmp 1b
jmp 017701
jmp 017701 " and then jump to the code
boot:
lac d2
lmq
sys read; 4096; 07700
lacq
lmq " Save the fd into MQ
sys read; 4096; 07700 " Read 4,032 words into locations 4096 onwards
" leaving the top 64 words for this boot code.
lacq " Get the fd back and close the file
sys close
jmp 4096
0
jmp 4096 " and jump to the beginning of that executable
0 " 0 marks the end of the code, used by the copy routine above
rline: 0
law ibuf-1
+20
View File
@@ -0,0 +1,20 @@
" Fork text code
main:
sys fork
jmp parent
child:
lac d1
sys write; childmsg; 3
sys exit
parent:
lac d1
sys write; parentmsg; 4
sys exit
d1: 1 " stdout fd
parentmsg: <pa>; <re>; <nt>; 012000
childmsg: <ch>; <il>; <d 012
+22
View File
@@ -533,9 +533,11 @@ sub cal {
9 => \&sys_close,
11 => \&sys_unlink,
14 => \&sys_exit,
16 => \&sys_intrp,
17 => \&sys_chdir,
18 => \&sys_chmod,
19 => \&sys_chown,
29 => \&sys_fork,
);
# Simulate the syscall. Each syscall updates the $PC
@@ -553,6 +555,26 @@ sub sys_exit {
exit(0);
}
# Intrp system call
sub sys_intrp {
# For now, do nothing
dprint("intrp system call\n");
$PC += 1;
return;
}
# Fork system call
sub sys_fork {
# Fork and get the child's process-id back, or zero if we are the child
my $pid= fork();
$AC= $pid;
# The parent returns back to PC+1, the child returns to PC+2
$PC += ($pid) ? 1 : 2;
return;
}
# Close system call
sub sys_close {