Project 1: Warm-up Project

Important Dates

Due: Wednesday, 9/17, by 9pm (or so).


Send questions to (or, of course, visit us in person during office hours!). If the question is about your code, hand in all of your code and include your login in your email (you are free to modify the contents of your handin directory prior to the due date). Also include all other relevant information, such as cutting and pasting what you typed and the results from the screen. In general, the more information you give, the more we can help!


There are two parts to this project:

  • Birthday Paradox: to be done on the mumble lab, so you can learn more about programming in C on a typical UNIX-based platform (Linux)
  • Kernel Intro: to be done in our xv6 hacking environment, so you can learn more about what actually goes on in a real kernel.

Click on the above links to learn more about what you should do. READ EACH CAREFULLY! Note: it will take a long time to read each and really make sure not to miss anything.


Before beginning, read this tutorial. It has some useful tips for programming in the C environment.

Read K+R (the course textbook on C) as it is a great introduction to the language. Familiarizing yourself with these topics will help you complete the programming projects:

  • character arrays, null terminated strings, character pointers (1.9, 5.5, 5.10)
  • pointer arithmetic (also called address arithmetic) (5.4)
  • using array notation on pointers and vice-versa (5.3)
  • pointer arrays (5.6)
  • function pointers (pointers to functions) (5.11, 5.12)
  • external declarations and the difference between definition and declaration (4.3, 4.4, A8)
  • preprocessor file inclusion (#include) and macro substitution (#define) (for constant style definitions) (4.5, 4.11)
These topics highlight the main differences between C and other languages like Java. They are generally what cause issues for programmers new to C.

This project, unlike all others this semester, must be done alone. Note that it is always OK to talk to others about your code, as well as help them debug their code. Copying code, however, is considered cheating. Don't do it! How will you learn that way? Read this for more info on what is OK and what is not.

Handing It In

For the C/Linux part of this project (the birthday paradox), you should turn in one file, called paradox.c . We will compile it in the following way:

shell% gcc -O -Wall -o paradox paradox.c
so make sure it compiles in such a manner. You should copy this file into your handin directory into the subdirectory called linux .

The handin directory (for Section 1) is ~cs537-1/handin/login/p1 where login is your login; for Section 2, it is the same but with a 2 (not a 1). For example, Tyler's login is harter, and thus he would copy his beautiful code into ~cs537-1/handin/harter/p1. Copying of these files is accomplished with the cp program, as follows:

cp paradox.c ~cs537-1/handin/harter/p1/linux/

For the xv6 part of the project, copy all of your source files (but not .o files, please, or binaries!) into the xv6/ subdirectory of your p1 directory. A simple way to do this is to copy everything into the destination directory, then type make to make sure it builds, and then type make clean to remove unneeded files.

shell% cp -r . ~cs537-1/handin/harter/p1/xv6
shell% cd ~cs537-1/handin/harter/p1/xv6
shell% make
shell% make clean

Finally, into your p1 directory, please make a README file. In there, describe what you did a little bit. The most important bit, at the top, however, should be the authorship of the project.


We are releasing tests for the paradox program and xv6. To run these tests, you need to be logged into a CSL machine - this will not work on your laptop or home computer.

To test your paradox program, enter

java -jar ~cs537-2/ta/tests/test1a/P1aTest.jar dir

where dir is the directory containing your paradox.c file. It is important that your file is named paradox.c!

Similarly, to test your xv6 code, enter

java -jar ~cs537-2/ta/tests/test1b/P1bTest.jar dir

where dir is the root directory (e.g, containing kernel, user, etc.) of your xv6 code.

The command will tell you what tests your code passed or failed. If your code passes all the tests, you will get a perfect grade. On the other hand, since we are releasing the tests, the onus on submitting code that compiles is on you - if your code does not compile, you will get no points.