“It works!”
It felt so good to finally say those words.
I stared at my terminal.
Two simple processes were running—one printing the Fibonacci numbers under 216, and the other listing the letters of the alphabet.
The programs were basic, but they were running concurrently on an operating system I built from scratch.
My OS now featured multi-programming and virtual memory. Timer interrupts initiated context switches, and my paging implementation ensured safe memory sharing.
I didn't rely on GCC or Clang. Instead, I designed my own 16-bit instruction set architecture, developed an emulator and assembler, and built the operating system from scratch without external tools or libraries. After grappling with the complexities of programming in assembly, I also built a compiler for a C-like language.
My systems programming coursework barely explained anything.
Important concepts were skipped or quickly glanced over. I had to seek out my own resources. As I am sure you are aware, the documentation for system programming topics is nowhere near as good as it is for higher level languages.
This made my learning process long and often frustrating, but it ignited my interest in making these topics easier to learn. I now help students learn systems programming by providing online tutoring.
I also develop interactive visualizations of system programming concepts to help students learn in a hands-on way without the need for reading/writing thousands of lines of code.