Lead Professor Professor Patrick McDaniel
Instructor Matthew Davis
Section Information
# Times Location TA
1 MWF 2:30-3:20pm 114 Earth & Eng Sciences Weining Lv
2 MWF 3:35-4:25pm 160 Willard Building Jungpeng Qiu
Office Hours Prof. McDaniel: M 10:00-12:00 or by appointment @ Room 360A IST
Office Hours Matthew Davis: by appointment
Section 1 TA: W/F 9:00-10:00 @ 359 IST Building
Section 2 TA : T/Th 2:00-3:00pm @ 338A IST Building
Credits 3
Course Textbooks NONE

This course explores the art and methods of systems programming. Practically speaking, lectures and course assignments will provide students experience programming in C within the UNIX environment. UNIX tools will be introduced, as will the general UNIX philosophy. Fluency in use of the command line will be encouraged and expected, as will canonical compiler tools such as gcc. We will examine the use of shell programs, compilers, build sequences, memory management, filesystems, signal processing, parallel programming, and other topics essential to computer scientists. In addition, we will introduce students the basics of systems administration on UNIX virtual machines.

A detailed list of a lecture by lecture contents, assignments, and due dates (subject to change as semester evolves) is available on the course schedule.

Course Philosophy

System programming concerns the development of software and services used by applications and operating systems, e.g., OS functions, de-fragmenter, web-servers, databases, search tools, backup systems, etc. This course will provide information and experience required to understand, design and implement components of large and small software systems.

In general, students successfully completing the coure will be able to evaluate design alternatives according to engineering best-practices, specifications, performance analysis, robustness, etc. This course will investigate one system and one programming language in detail through demonstration programs programming assignments. The specific system is Unix, a family of operating systems forming a complete standardized programming environment based on the idea of software tools. The specific language is C, which is widely used for operating system implementations, and which forms the basis for the C++ and Java languages studied in the prerequisite courses. This will help students understand operating system services available to application programmers, and provide a firm ground for study of operating systems in general.

Important: This course covers the basic skills and topics that form the foundation of later CMPSC and CMPEN courses. For this reason, it is essential that every student attend and learn the material. It will be nearly impossible for students to complete later courses in these majors without mastery of this material.


The course will be graded on exams, course projects, and class participation in the following proportions:

Percentage Activity
50% Course Projects
12.5% Mid-term Exam
12.5% Mid-term Exam
15% Final Exam (week of Dec 16, time/date TBD)
10% Class Participation

Course Projects

The course projects require students to develop and debug systems programs. The details of the projects will be made in class and through project descriptions made available on the course website.

Policy: The course projects are to be carried out individually. Students are explicitly not allowed to share information, source code, or even discuss the contents of the projects. Any violation of this policy will be considered cheating and will result in the student being removed from the class and given an 'F' grade.

Students are forbidden from copying code, makefiles, or any other material from the Internet. Any violation of this policy will also be considered cheating, and handled as described above.

Class Participation

Course lectures will be partially driven the contents of assigned reading. Students are going to be required to participate in discussions of the content during each lecture. Hence, the students ability to exhibit comprehension of the material is essential to a passing grade.

Lateness Policy

Assignments are assessed a 10% per-day late penalty, up to a maximum of three days after which a zero grade will be given. No exceptions. Period.

Virtual Machines/Student Computer

As part of the course projects, every student will be required to maintain a virtual machine on a personal computer or on a CSE server. Students are responsible for administrating and maintaining these virtual machines, and are encouraged to back them up frequently.

It is the student's responsibility to have a functioning and suitably powerful computer to run their virtual machines. The minimum requirements for this computer that is have 100MB free storage, 8MB memory and have a 64bit processor. Netbooks and tablets are not suitable.

Course Prerequisites

You must have completed and passed (with a grade of C or better) the prerequisite course CMPSC 221, Object Oriented Programming with Web-Based Applications, which uses Java. You must have completed and passed (C or better) the earlier courses CMPSC 121 and 122, which use C++. If, instead, you have completed and passed similar courses elsewhere, contact the instructor. Prior experience with Unix or C is not expected, but you should know C++ very well, and know how to use an integrated development environment, e.g., as Microsoft's Visual Studio.

You should take CMPEN 331, Computer Organization and Design, at the same time as this course, or within one semester of it. The connection between these courses would be stronger if we could require you to take both at the same time, but that's not possible. In 331, you learn about the basics of memory organization (registers, cache, main memory, virtual memory), instruction execution, exceptions and interrupts, and the translation of procedural programming languages into machine instructions.

This is a three-credit course, and you can expect to spend a lot of time outside of class with working on the project programming. To avoid turning the programming assigments into a nightmare of unsuccessful debugging, you should recognize symptoms of confusion early, and promptly ask for help from the professor or TA. Note that the final 3 projects build on previous assignments (you must start with the code submitted in the previous assignment), so incomplete or poor code will make later assignments very difficult if not impossible. For this reason, it is essential student do not get behind on the projects.

We will often give you some code as examples or as a starter kit for an assignment, and use of that material is encouraged. After that point, the programming work should be done on your own. This will be strictly enforced.

Ethics Statement

This course considers topics involving systems. As part of this investigation we will cover technologies whose abuse may infringe on the rights of others. As an instructor, I rely on the ethical use of these technologies. Unethical use may include circumvention of existing security or privacy measurements for any purpose, or the dissemination, promotion, or exploitation of vulnerabilities of these services. Exceptions to these guidelines may occur in the process of reporting vulnerabilities through public and authoritative channels. Any activity outside the letter or spirit of these guidelines will be reported to the proper authorities and may result in dismissal from the class.

Any instance of sharing or plagiarism, copying, cheating on tests, or other disallowed behavior will constitute a breach of ethics and will result in dismissal from the class with a failing grade. Programming assignments must be completed without assistance or cooperation between students.

Students are responsible for reporting any violation of these rules by other students, and failure to constitutes a ethical violation that carries with it similar penalties.

When in doubt, please contact the course professor for advice. Do not undertake any action which could be perceived as technology misuse or cheating anywhere and/or under any circumstances unless you have received explicit permission from Professor McDaniel.

Course Updates

[12/03/2016] The pseudo-code and checklist is available in text form (thanks to your fellow 311 student Justin Colon-Gerhart). The link is here.

[11/01/2016] There will be an in class assignment in Wednesday's class (11/16) on profiling. Please see the instructions here.

[11/01/2016] I have updated the cartridge library to show performance numbers that reflect the costs of using the IO bus. You can get the new version of the library from here or simply download the latest version of starter tar file which has the content now.

[10/28/2016] Assignment #3 update: There was a small error in the Makefile for assignment #3. You can re-download original startup file or simply replace the Makefile in the assignment directory with the one here.

[10/05/2016] Assignment #2 update: CART_OP_BZERO - this opcode zeros the _current_ cartridge, as set by the CART_OP_LDCART opcode. You should ignore the CT1 field in the CART_OP_BZERO opcode, instead calling the load cartridge to the one you wish to zero.

[07/31/2016] Setting up an initial website for Fall 2016. Note that the schedule will likely change before and during the semester. Please review the course schedule frequently.

[08/22/2016] The course website is now up. Please review the materials throughout before the first day of class.

[08/31/2016] There is a correction to the test output for assignment #1. You can update the replaced output here, or download the startup files from the normal location (but be sure not to overwrite any work you have already done.

[08/31/2016] Students interested in the honors option should review the requirements and details provided here. If you would like to proceed with this option, please approach Dr. McDaniel in lecture or office hours with the appropriate forms.

[09/26/2016] A couple of bugs have been fixed and more debugging output has been added to the CART library. Please redownload the starter file (but make sure not to overwrite your existing code) or download the cart library directly from here.