5. What you should know#

From having taught operating systems for multiple years, we have learned two things: you have learned this material in other courses, and you probably got away without really mastering it. For example, many of you have never really written a proper makefile to automate compilation, and most of you have debugged programs without mastering the debugger.

Before taking this course, you should have good familiarity with:

  1. Unix shells: The shell in Unix is the fundamental interface to the operating system, and understanding its capabilities is key to using the operating system, developing software, and most importantly for this course, understanding the core abstractions of operating systems.

  2. Editors: In this section we will introduce two terminal text editors that are frequently used on Unix machines. Learning to write code on these editors are essential without access to modern IDEs with GUIs like Visual Studio Code.

  3. Make: As the size of your projects increase, the need for automation via Makefiles also increase. You don’t want to be typing the compile commands for all of your files or repetedly pressing the up arrow for previous compile commands after every change.

  4. Revision control/git: Version control is important to keep records of long-standing projects and to clearly communicate changes to other developers working on the same project.

  5. Debuggers/gdb: Print statements won’t show everything going on in a process. In addition to printing variable values, GDB allows more powerful debugging tools such as changing the value of variables at run time, switching between threads, examining CPU registers, etc.

  6. The C programming language: It is the most used programming language for operating systems. By mastering the language, you will reduce the number of syntax errors, and can focus more on debugging the logical errors.

  7. How to test your code: They are not only used to determine whether or not a program runs correctly, but also to test whether or not you understand how the system is supposed to work. They are really helpful for edge cases. Get rid of the “guess and check” mindset and write some tests.

We can guarantee that you won’t be successful if you do not master your tools because the programming assignments for operating system courses tend to me more demanding. We recommend this book by Jonathan Appavoo as a more detailed reference on most of what we cover here.