I’ve decided to go on this random adventure. Over the years I’ve explored a couple of different CS areas. First I started out with advanced JS programming. Eventually I realized it was pretty hard to break new ground there. I’m proud of the things I built and the knowledge I gained but I realized that if one want to break new ground, one has to go where the hard stuff is.
I moved on to machine learning. That’s was cool but I realized early on that breaking new ground there meant a deep understanding of mathematics. I bought some math books and bulked up on math. At a certain point I felt math wasn’t really what I was interested in – at least not the level of math necessary to come up with novel machine learning angles.
My ML adventures also turned out to be worth it because now I can say I have a solid basic understanding of ML in theory and practice, not to mention I feel pretty comfortable with math-centric academic papers as long as they don’t get to domain specific.
I suppose the number one thing I learned is that I like reading and writing software. I wondered where the hard stuff lie for a person with my interests. I settled on operating systems. OK now what?
It turns out OS development is a bit of a dark art. There’s resource out there, but they are all over the place and vary wildly in quality. I’ve always wanted to know how to make cool stuff from scratch. I’m now trying to learn how to bring dead metal and silicon to life via low-level programming. At some point this may lead me to hardware development. At the bootloader level, you need to be very aware of the hardware and there aren’t that many abstractions between you and it.
I started off by reading a kernel development manual from 1999. I know it’s outdated but I figured you have start with the basics. It’s worked out pretty good because it was a mash up of generic OS concepts with Linux-specific examples.
Next I moved on the the Kernel Hacker’s Guide (1998) which turned out not to be so great but it did point me in a good direction. It talked about how system calls worked in Linux. Although this is no longer how they work, the code and concepts it pointed to dated back to the earliest days which provided great insight into the thought process of Linus and other early contributors. I also started looking at source and finding parts that were referenced had been removed from the kernel, which also provided insight. Why had these parts been removed? What had they been replaced with?
Currently I’m reading a slightly more recent kernel guide, 2004’s Linux Kernel 2.4 Internals. This also referenced a since-excised piece of code: the original bootsect.S boot loader written by the man himself, Linus. This in turn pushed me to learn about the ancient ways of gas and also how pre-page table and global descriptor table (GDT) memory segmentation worked.