This course has four purposes. First, you will learn about the hierarchy of abstractions and implementations that comprise a modern computer system. This will provide a conceptual framework that you can then flesh out with courses such as compilers, operating systems, databases, networks, security, real-time systems, and others. The second purpose is to demystify the machine and the tools that we use to program it. This includes telling you the little details that students usually have to learn by osmosis. In combination, these two purposes will give you the background to understand many different computer systems. The third purpose is to bring you up to speed in doing systems programming in a low-level language (C) in the Unix (Linux/GCC/GDB/etc) environment. The final purpose is to prepare you for upper-level courses in systems.
This is a learn-by-doing kind of class. You will write pieces of code, compile them, debug them, disassemble them, measure their performance, optimize them, etc.
- CS211 or equivalent: C programming experience and Unix environments
Randal E. Bryant and David R. O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition, Prentice Hall, 2015, (ISBN-13:978-0134092669,ISBN-10:013409266X)
Large assignments often performed in groups. The emphasis is on exploring and understanding computer systems concepts with a focus on challenges for the students to complete. Recently, common labs have been:
- Data Lab: solve puzzles through bitwise operations
- Bomb Lab: reverse engineer secret inputs from a program’s assembly code
- Attack Lab: use stack overflow and return-oriented programming to control a program
- SETI Lab: use threads and parallelism to speed up scientific computations
Small, individual practice problems performed on paper. The goal here is to practice the concepts we have learned in class so that students can better understand them.