Status: The xv6 code is in pretty good shape, but the commentary is rough.
For many years, MIT had no operating systems course. In the fall of 2002, Frans Kaashoek, Josh Cates, and Emil Sit created a new, experimental course (6.097) to teach operating systems engineering. In the course lectures, the class worked through Sixth Edition Unix (aka V6) using John Lions's famous commentary. In the lab assignments, students wrote most of an exokernel operating system, eventually named Jos, for the Intel x86. Exposing students to multiple systems–V6 and Jos–helped develop a sense of the spectrum of operating system designs. In the fall of 2003, the experimental 6.097 became the official course 6.828; the course has been offered each fall since then.
V6 presented pedagogic challenges from the start. Students doubted the relevance of an obsolete 30-year-old operating system written in an obsolete programming language (pre-K&R C) running on obsolete hardware (the PDP-11). Students also struggled to learn the low-level details of two different architectures (the PDP-11 and the Intel x86) at the same time. By the summer of 2006, we had decided to replace V6 with a new operating system, xv6, modeled on V6 but written in ANSI C and running on multiprocessor Intel x86 machines. Xv6's use of the x86 makes it more relevant to students' experience than V6 was and unifies the course around a single architecture. Adding multiprocessor support requires handling concurrency head on with locks and threads (instead of using special-case solutions for uniprocessors such as enabling/disabling interrupts) and helps relevance. Finally, writing a new system allowed us to write cleaner versions of the rougher parts of V6, like the scheduler and file system.
6.828 substituted xv6 for V6 in the fall of 2006. Based on that experience, we cleaned up rough patches of xv6. Since then, xv6 has stabilized, so we are making it available in the hopes that others will find it useful too.
6.828 uses both xv6 and Jos. Courses taught at UCLA, NYU, Peking University, Stanford, Tsinghua, and University Texas (Austin) have used Jos without xv6; we believe other courses could use xv6 without Jos, though we are not aware of any that have.
xv6 compiles using the GNU C compiler, targeted at the x86 using ELF binaries. On BSD and Linux systems, you can use the native compilers; On OS X, which doesn't use ELF binaries, you must use a cross-compiler. Xv6 does boot on real hardware, but typically we run it using the Bochs emulator. Both the GCC cross compiler and Bochs can be found on the 6.828 tools page.
The chapters are rough drafts.
Introduction yet to be written.
The Unix system call interface. (rev 4)Chapter 1: Bootstrap
From power on to kernel start. (rev 4)Chapter 2: Processes
Memory and process allocation, segments, the first user process. (rev 4)Chapter 3: Traps
Low-level trap mechanism, trap handler, system call arguments, sbrk, fork.Chapter 4: Locks
Locks and interrupts.Chapter 5: Scheduling and coordination
Scheduling, sleep and wakeup, pipes, wait and exit.Chapter 6: Buffer cache
Buffer cache and IDE disk driver.Chapter 7: File system data
Block in use bitmap, block allocation, inode structure, inode contents, directories, path names.Chapter 8: File system calls
FIle descriptors, open, close, dup, read, write.Chapter 9: Exec
ExecAppendix A: Low-level C and inline assembly
Intro to C and inline assembly for people who only know Java (say). Examples drawn entirely from xv6 source.Appendix B: Additional drivers.
Keyboard, screen, probably MP hardware.
6.828's xv6 is inspired by Unix V6 and by:
Russ Cox (rsc@swtch.com)
Frans Kaashoek (kaashoek@mit.edu)
Robert Morris (rtm@mit.edu)
You can reach all of us at 6.828-staff@pdos.csail.mit.edu.