Project 0: Install

Fall 2014

Due: Tuesday, October 14, at Midnight

Note: This is an individual assignment. Each student must submit a copy of their session's output.

In this "project" you will familiarize yourself with installing and compiling the Nachos distribution. You will also practice using the debugger on the nachos executable as it runs. The tutorial below should not take that much time at all; if you seem to be having serious problems, send us mail immediately.

Step 1: Download and build

[0 pts] When logged into, if the prompt does not say that you are prep-ed for cs120f, please run prep manually (it does no harm to run it more than once):

$ prep cs120f

(You should be able to work on Nachos, but prep sets up the environment variables for turning in your project.)

Now download the nachos repository:

$ git clone

Build a nachos executable using the make command in the code directory:

$ cd nachos/code
$ make

(You might see some warnings that say Clock skew detected. That is normal; it happens when make runs on a network file system where the clock is not well synchronized.)

This will create versions of the nachos executable in various subdirectories. We will be using the threads directory for the upcoming project 1, so let's use that nachos exectuable. Run it without any arguments -- it should produce output similar to the following:

$ cd threads
$ ./nachos
*** thread 0 looped 0 times
*** thread 1 looped 0 times
*** thread 0 looped 1 times
*** thread 1 looped 1 times
*** thread 0 looped 2 times
*** thread 1 looped 2 times
*** thread 0 looped 3 times
*** thread 1 looped 3 times
*** thread 0 looped 4 times
*** thread 1 looped 4 times
No threads ready or runnable, and no pending interrupts.
Assuming the program completed.
Machine halting!

Ticks: total 130, idle 0, system 130, user 0
Disk I/O: reads 0, writes 0
Console I/O: reads 0, writes 0
Paging: faults 0
Network I/O: packets received 0, sent 0

Cleaning up...

Step 2: Debug and report

[5 pts] Nachos is like any other program in that it starts by running the main() procedure. In Nachos, main() is in threads/ If you examine threads/, you will see that you are executing the ThreadTest function (in It is the printf in the SimpleTest class that produced the initial output when you ran the nachos executable. ThreadTest is a simple example of a concurrent program. In this case there are two independent threads of control executing "at the same time" and accessing the same data. Your first goal is to understand the thread primitives used by this program, and to do some experiments to help you understand what really happens with multiple threads at runtime. To understand the execution path, trace through the code for the simple test case. See the notes in Tracing and Debugging Nachos Programs for some tips on how to do this.

Specifically, run the nachos executable in gdb (be sure you are in the threads subdirectory):

$ gdb ./nachos

Set a breakpoint in SimpleThread (try using tab completion!):

(gdb) break SimpleThread(int)

Start running the program:

(gdb) run

Step through the program to see what happens during the execution:

(gdb) n

Continue to step through until you see *** thread 1 looped 3 times printed. Print out the stack for the current thread, and print the value of the variables which and num:

(gdb) where
(gdb) print num
(gdb) print which

We're done stepping, continue the program:

(gdb) c

(You can type q in gdb to quit to the shell.)

Copy the output of your session of running gdb on nachos and paste it into a file named project0.txt. Be sure to include all of the commands that you executed and all of the output generated. Then run:

$ turnin project0.txt

Be sure to submit your output by the deadline (turnin will be disabled by then).