Course Overview


Welcome to your first course in the software-side of computer systems! introduce you to an exciting range of materials from the broad field of systems programming, including the basics of how CPUs work, assembly-language programming, higher-level programming in C, the memory hierarchy, disks and I/O, interrupts and exceptions, and so forth. All very cool stuff that every serious programmer should know!

This course assumes familiarity with basic programming (CS 302, though CS 367 would be better) and a little about how a CPU works (CS 252), though we'll try to fill in as much as you need. You'll be doing a lot of hands-on projects in both C (the greatest language ever, naturally) and some in assembly (x86), so get ready for a lot of work. If that doesn't sound good, well, tough luck! You're in the wrong profession.


For learning about computer systems, we recommend coming to class and paying attention. Then, some time after class, read the assigned reading. We'll track what you might want to read on the web page; stay tuned for details.

For the main text book, we have chosen an awesome book out of Carnegie-Mellon known as Computer Systems: A Programmer's Perspective (2nd edition). Many books in CS are frankly not worth buying; this one is, as the authors have done a magnificent job pulling together a huge amount of fascinating material. It will help you learn all about the details of modern computer systems. We recommend it.

For the main programming book, you should consider The C Programming Language book, usually called K+R (after its famous authors, the inventors of the C language!). This book is on virtually every Computer Scientist's bookshelf, and should be on yours as well.

We'll also try to provide as much material from lecture as possible, in some kind of written form. Thus, you may be able to get by without these books, but we recommend them as an alternate source of material. Stay tuned for details.

Mailing Lists

Important announcements will be sent to the class mailing list ( as well as posted to the web page, so please read your mail frequently (particularly around project time)! You are responsible for the material sent to that list. Note that the class list is automatically generated based on who is enrolled in the class.

Homeworks and Projects

As part of the course, you will complete a number of programming assignments and homeworks. In sum, these are worth about half of your grade. You should perform these projects on PCs running the Linux operating system (more about this later).

The projects are a fundamental part of this course. Most projects require a significant amount of time; do not procrastinate! It is likely they will take longer than you expect. Do not wait until the day before the assignment is due to start. These assignments should be started pretty much when they are handed out. All information necessary to complete the assignments will be available from the class web page.

As stated above, all of the assignments will be in C or x86 assembly. We will help introduce these a bit but of course the real learning of anything is done, hour by painstaking hour, on your own. Get to work!

For the programming projects, you will primarily be graded on how well your implementation works. We will test your program on a suite of input sets. Your grade will be based on how many of the tests your application passes; we will also briefly examine your code to ensure that you followed the specifications of the assignment.

Also, don't cheat (duh).


There will be some exams to test your knowledge. Exams are worth the other half of your final grade. The exams will be closed book, and will cover material from class and the projects.

  • Midterm: Tuesday, March 14th Thursday, March 16th 6pm-8pm
  • Final: Monday, May 8th, 6pm-8pm