I'll make no bones about it, CS124 is a hard class. It's 12 units for a reason, and although we try hard to make sure the uniting is reasonable and that students get all the guidance and support that they need, it's still a really hard class for most students who take it. Part of the reason is that systems programming is, simply, a very hard thing to do. It requires an attention to detail and a persistence that most kinds of programming just don't require. You are working just above the hardware, and you don't have the kinds of tools for debugging and system monitoring that you might have, say in a Java or Python program, or even things like valgrind for debugging a C or C++ application.
That said, it is also incredibly fun when you get things working, and it is one of the most fulfilling creative efforts, because you really are building things from scratch. You will understand how the computer does what it does, so much more deeply than you ever did before. Towards the end of CS124 one year, a student was sitting in my office working on one of the projects, and he picked up his laptop and said, "I finally feel like I understand everything going on inside this machine." So, it's painful, but it's also worth it.
Before you go on, you should read this very well-known article about the world of systems programming. James Mickens is a hilarious dude. Fortunately, CS124 will provide many tools to facilitate work on your operating system, so it won't be quite as dire as what Mickens describes. But, by the end of this course, you will definitely be able to relate.
If you want to maximize your chances of completing CS124, here is what I would recommend.
Make sure you have taken CS24, and feel reasonably confident with all of the material. CS24 is a hard requirement for this course. You will see many CS24 concepts in CS124 in greater detail, but the concept that seems to be the most challenging is virtual memory. We don't implement virtual memory until the 5th assignment, but it has an impact on overall system design approaches all the way through the course. So, any familiarity you have with virtual memory and paging at the start of the course will help you all the way through.
Don't take CS124 with a heavy course load, or with other project classes during the same term. Just don't do it. You will end up dropping stuff, or doing poorly in stuff, or both.
It's useful to have a working CS (aka "CMS") cluster account. I will make sources available on the CS cluster. If you have a CS cluster account but it is inactive or you forgot your password, go see the system admins in 112 Annenberg during their office hours, and bring your student ID so you can prove who you are. If you don't already have a CS cluster account, you can request one at this page. Do not request a new account if you already have an inactive account! This causes a lot of extra work for the sysadmins.
I would get this taken care of as soon as possible, like even before the term starts. Why? The sysadmins will be drowning in account-creation and account-reset requests for the first two weeks, due to CS1 and other classes. Don't get caught in that rush!
Make sure you are quite comfortable with C programming, including pointers and memory management. You will see lots of wild things in OS implementation, particularly involving pointer manipulation and memory management tricks that you have probably never seen before. If this part makes you nervous, don't worry - Donnie and the TAs are happy to explain anything you might have questions about; it's really cool stuff! But be as comfortable as possible with C programming. You will probably see pointers-to-pointers-to-pointers before long. (Very rarely, they are actually a good idea.)
You should have some familiarity with Git and repository management. While basic operations are explained in the course, there are many Git features that can help manage a large project like this. For example, if one teammate is making a significant change to the OS, they can do this work on a branch so that other teammates can work on stable code. Having good Git skills definitely improves this class.
To this end, you can look at the Atlassian Git tutorials which cover many different aspects of Git. Or, you can do the Try Git tutorial which will start with the most basic facilities, all the way up to more sophisticated operations. You should also take a look at the Pro Git book online; it is full of useful information about how to do anything and everything with git.
I require that CS124 students work in teams of 2-3 people. You are not allowed to attempt CS124 on your own. The main reason why is that debugging these systems is much easier when you have other people to talk to about what you are seeing, and potential solutions to problems you encounter. Even if you start out with a team of three, and your teammates all decide to drop the class, you will need to join another team to complete the class.
It is best to start CS124 with a team already in mind. The first assignment goes out on the first Wednesday of the term, and is due the next week, so you don't want to lose time forming a team when you need to be designing and coding up your implementation.
Here are some important considerations when forming a team:
Are all teammates equally committed to completing the class? This is probably one of the most important considerations in taking CS124, and you should have a candid conversation with your teammates about your level of commitment, and theirs. Is it a class that you cannot drop? Is it a class that you are interested in, but may drop if it becomes too hard or your grades get too low? Are you willing to pass/fail the class? Make sure you explore these questions with your teammates.
We have seen numerous configurations emerge through the years. We have seen teams where one person is on grades and the other teammates are on pass/fail. This is a challenging situation, particularly because the pass/fail folks are less motivated than the person on grades. But, it can be done.
We have seen quite a few teams make a "pact" with each other, that if one person chooses to drop the course, all members will choose to drop the course. Such a pact should, of course, be discussed and considered carefully before it is agreed to. But, it also seems to work well for people.
In cases where a person's teammates decide to drop, and they are left by themselves, we have had pretty good luck placing them with another team quickly. Of course, we like to avoid this situation, but it's not always avoidable.
"E" grades are only granted to entire teams; we will not grant an "E" grade to a subset of the team.
Is at least one teammate comfortable with IA32/x86-64 assembly language programming? A few parts of the course require familiarity with assembly programming, and it is good to have at least one teammate who is strong in this area.
Are all teammates comfortable with C programming? All teammates will need to contribute to complete each assignment, so it is important to consider this at the start of the course.
Is at least one teammate familiar or strong with the Git version control system? It is very nice to have a Git expert to turn to for repository management issues.
Of course, if you don't have a team, just let Donnie know and he will find a team for you.
No books are required for this course. I don't think you should spend a ton of money on books unless you have extra money kicking around, and/or this is a particularly interesting topic for you. All necessary material is covered in lectures, or in the assignment write-ups. So you really don't need these books to complete the class.
That said, there are two books that a lot of the course material is based on.
The "general theory" textbook is "Operating System Concepts" (9th ed) by Silberschatz, Galvin and Gagne. It's $170 from Amazon.com, which is insane. There isn't really a lot of reason to get this book unless you're just interested in it. There is no assigned reading in the class, and all required information is covered in the lecture slides and assignment write-ups. But, if you have a ton of money to burn, or you are unfamiliar with the concept of regret, you might want to pick up a copy. (Note that there is also an "essentials" version of the book - that's not the correct version.)
The "implementation details" textbook is "Understanding the Linux Kernel" (3rd ed) by Bovet and Cesati. It's about $41 on Amazon.com. I like this book a lot, and in the past I definitely would have recommended that you purchase a copy, but it is getting a bit dated by now. It covers the Linux 2.6 kernel, and we are already to the 4.12 kernel. That said, this book goes through a ton of Linux kernel internals, in a ton of detail. If you want to understand how some of these features are implemented, this is a great book.
"You will be. You will be." -- YodaOkay, you read through all of the above, and you are still excited to take CS124. Awesome! What can you do to get ready for it?
Figure out your team.
Review the CS24 slides.
Get your CS cluster account ready.
Start reviewing some of the Unix system calls, like fork(), execvp(), etc. The first assignment is implementing a command shell! (And if you have already done this before, sorry but no you cannot use your previous code.)
Figure out where you want to host your team's Git repository. You must use a private repository for CS124. (We have seen team repositories cloned in the past.) Github and BitBucket both provide private repositories for academic use, but you may have to request it from their website. You can also host your repository on the CS cluster if you wish. (These details can be ironed out in the first week, but it's better if you already have a plan before the first assignment.)