Checkpoint some warm-up exercises
This commit is contained in:
		
							parent
							
								
									a77287e924
								
							
						
					
					
						commit
						711bd3156d
					
				
					 1 changed files with 155 additions and 0 deletions
				
			
		
							
								
								
									
										155
									
								
								labs/xv6.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								labs/xv6.html
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,155 @@
 | 
			
		|||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
<title>Homework: xv6</title>
 | 
			
		||||
<link rel="stylesheet" href="homework.css" type="text/css" />
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
 | 
			
		||||
<h1>Lab: xv6</h1>
 | 
			
		||||
 | 
			
		||||
This lab makes you familiar with xv6 and its system calls.
 | 
			
		||||
 | 
			
		||||
<h2>Boot xv6</h2>
 | 
			
		||||
 | 
			
		||||
<p>Login to Athena (e.g., ssh -X athena.dialup.mit.edu) and attach the course
 | 
			
		||||
locker: (You must run this command every time you log in; or add it to your
 | 
			
		||||
~/.environment file.)
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
$ add -f 6.828
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<p>Fetch the xv6 source:
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
$ mkdir 6.828
 | 
			
		||||
$ cd 6.828
 | 
			
		||||
$ git clone git://github.com/mit-pdos/xv6-riscv.git
 | 
			
		||||
Cloning into 'xv6-riscv'...
 | 
			
		||||
...
 | 
			
		||||
$
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<p>XXX pointer to an update tools page
 | 
			
		||||
 | 
			
		||||
<p>Build xv6 on Athena:
 | 
			
		||||
<pre>
 | 
			
		||||
$ cd xv6-public
 | 
			
		||||
$ makeriscv64-linux-gnu-gcc    -c -o kernel/entry.o kernel/entry.S
 | 
			
		||||
riscv64-linux-gnu-gcc -Wall -Werror -O -fno-omit-frame-pointer -ggdb -MD -mcmodel=medany -ffreestanding -fno-common -nostdlib -mno-relax -I. -fno-stack-protector -fno-pie -no-pie   -c -o kernel/start.o kernel/start.c
 | 
			
		||||
...
 | 
			
		||||
$ make qemu
 | 
			
		||||
...
 | 
			
		||||
mkfs/mkfs fs.img README user/_cat user/_echo user/_forktest user/_grep user/_init user/_kill user/_ln user/_ls user/_mkdir user/_rm user/_sh user/_stressfs user/_usertests user/_wc user/_zombie user/_cow 
 | 
			
		||||
nmeta 46 (boot, super, log blocks 30 inode blocks 13, bitmap blocks 1) blocks 954 total 1000
 | 
			
		||||
balloc: first 497 blocks have been allocated
 | 
			
		||||
balloc: write bitmap block at sector 45
 | 
			
		||||
qemu-system-riscv64 -machine virt -kernel kernel/kernel -m 3G -smp 3 -nographic -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0
 | 
			
		||||
hart 0 starting
 | 
			
		||||
hart 2 starting
 | 
			
		||||
hart 1 starting
 | 
			
		||||
init: starting sh
 | 
			
		||||
$
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
If you type <tt>ls</tt> at the prompt, you should output similar to the following:
 | 
			
		||||
<pre>
 | 
			
		||||
$ ls
 | 
			
		||||
.              1 1 1024
 | 
			
		||||
..             1 1 1024
 | 
			
		||||
README         2 2 2181
 | 
			
		||||
cat            2 3 21024
 | 
			
		||||
echo           2 4 19776
 | 
			
		||||
forktest       2 5 11456
 | 
			
		||||
grep           2 6 24512
 | 
			
		||||
init           2 7 20656
 | 
			
		||||
kill           2 8 19856
 | 
			
		||||
ln             2 9 19832
 | 
			
		||||
ls             2 10 23280
 | 
			
		||||
mkdir          2 11 19952
 | 
			
		||||
rm             2 12 19936
 | 
			
		||||
sh             2 13 38632
 | 
			
		||||
stressfs       2 14 20912
 | 
			
		||||
usertests      2 15 106264
 | 
			
		||||
wc             2 16 22160
 | 
			
		||||
zombie         2 17 19376
 | 
			
		||||
cow            2 18 27152
 | 
			
		||||
console        3 19 0
 | 
			
		||||
</pre>
 | 
			
		||||
These are the programs/files that <tt>mkfs</tt> includes in the
 | 
			
		||||
initial file system.  You just ran one of them: <tt>ls</tt>.
 | 
			
		||||
 | 
			
		||||
<h2>sleep</h2>
 | 
			
		||||
 | 
			
		||||
<p>Write a program that sleeps for a user-specified number of seconds,
 | 
			
		||||
  compile it, and run it.
 | 
			
		||||
 | 
			
		||||
<p>Some hints:
 | 
			
		||||
  <ul>
 | 
			
		||||
    <li>Look at some of the other programs in <tt>user/</tt> to see
 | 
			
		||||
    how you can obtain the arguments passed to a program.  If the user
 | 
			
		||||
    forgets to pass an argument, sleep should print an error message.
 | 
			
		||||
 | 
			
		||||
    <li>The argument is passed as a string; you can convert it to an
 | 
			
		||||
      integer using <tt>atoi</tt> (see user/ulib.c).
 | 
			
		||||
 | 
			
		||||
    <li>Use the system call <tt>sleep</tt> (see user/usys.S).
 | 
			
		||||
 | 
			
		||||
    <li>Make sure <tt>main</tt> calls <tt>exit()</tt> in order to exit
 | 
			
		||||
    your program.
 | 
			
		||||
 | 
			
		||||
    <li>Add the program to <tt>UPROGS</tt> in Makefile and compile
 | 
			
		||||
      user programs by typing <tt>make fs.img</tt>.
 | 
			
		||||
 | 
			
		||||
  </ul>
 | 
			
		||||
 | 
			
		||||
  <p>Run the program from the xv6 shell:
 | 
			
		||||
    <pre>
 | 
			
		||||
      $ make qemu
 | 
			
		||||
      ...
 | 
			
		||||
      init: starting sh
 | 
			
		||||
      $ sleep 5
 | 
			
		||||
      (waits for a little while)
 | 
			
		||||
      $
 | 
			
		||||
    </pre>
 | 
			
		||||
 | 
			
		||||
  <p>Optional: write an uptime program that prints the uptime in terms
 | 
			
		||||
  of ticks using the <tt>uptime</tt> system call.
 | 
			
		||||
 | 
			
		||||
<h2>pingpong</h2>
 | 
			
		||||
 | 
			
		||||
<p>In the previous exercise, if you made an error in sleep, the
 | 
			
		||||
  program may have exited prematurely, but it didn't affect other
 | 
			
		||||
  processes because xv6 isolates processes.  Sometimes you want
 | 
			
		||||
  processes to interact with each other.  Xv6 provides two ways to do:
 | 
			
		||||
  either through the file system (one process can create a file and
 | 
			
		||||
  another process can read that file) or through pipes.  In this
 | 
			
		||||
  exercise you explore interprocess communication through pipes.
 | 
			
		||||
 | 
			
		||||
<p> Write a program that uses UNIX system calls to ``ping-pong'' a
 | 
			
		||||
  byte between two processes over a pair of pipes, one for each
 | 
			
		||||
  direction. The parent sends by writing a byte to <tt>fd[1]</tt> and
 | 
			
		||||
  the child receives it by reading from <tt>fd[0]</tt>. After
 | 
			
		||||
  receiving a byte from parent, the child responds with its own byte
 | 
			
		||||
  by writing to <tt>fd[1]</tt>, which the parent then reads.
 | 
			
		||||
 | 
			
		||||
<p>Some hints:
 | 
			
		||||
  <ul>
 | 
			
		||||
    <li>Use <tt>pipe</tt> to create a pipe.
 | 
			
		||||
    <li>Use <tt>fork</tt> to create a child.
 | 
			
		||||
    <li>Use <tt>read</tt> to read from the pipe, and <tt>write</tt> to write to the pipe.
 | 
			
		||||
  </ul>
 | 
			
		||||
 | 
			
		||||
<h2>find</h2>
 | 
			
		||||
 | 
			
		||||
<h2>Optional: modify shell</h2>
 | 
			
		||||
  
 | 
			
		||||
<p>Modify the shell to support lists of commands, separated by ";"
 | 
			
		||||
 | 
			
		||||
<p>Modify the shell to support sub-shells by implementing "(" and ")" 
 | 
			
		||||
  
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	Add table
		
		Reference in a new issue