As a current graduate student specializing in systems at Georgia Tech OMSCS, I would love to see this class offered online. What's piques my interest is are the following two labs: preemptive multitasking (i.e. implementing processes) and FAT32 file system (i.e. implementing a file system, something I've always wanted to do)
> FAT32 file system (i.e. implementing a file system, something I've always wanted to do)
It's worth learning both how FAT32 works and how a simple inode-based filesystem works. They're quite different styles, and inode-based systems support things like hardlinks.
I got to the point where I could read the header / metadata from a FAT32 image, but I couldn't find the right offset to read a file. Is there a definitive document anywhere? I remember I was jumping between at least 3 documents with varying levels of completeness.
FAT is enjoyable! I spent a rather insane summer on a personal project to implement a FAT16 interface speaking the SD protocol to an SD card over an SPI bus.... from scratch. I think I had five spec documents open simultaneously at one point, spanning the stack from FAT to the microprocessor I was using.
It was insane, but I learned an incredible amount from it. Would recommend, even if you focus only on FAT.
Cool project! Doing things like that from scratch can teach a lot.
Was your implementation able to write to the SD card, too? This seems like the much hard part to me because you need to do implement the data structure changes and block allocations for files. Reading from a file system often boils down to following the right offsets until you get to file content, at least in journal-less file systems.
Yeah, writing was supported too. Absolutely was the harder part, since you have to worry about allocating new segments for your directories as your filesystem grows.
Ironically, looking at my code now, it seems like I never got around to actually writing file contents. I seem to have stopped after finishing the overall FAT16 filesystem structure traversal and mutation.
The SD card module was a little simpler, because I only really needed to implement flows for the commands involved in initialization and single-block reads and writes. The SD card presents a block-oriented storage interface, but it doesn’t really care what you’re storing otherwise.
Also currently a student in the program, and I agree this would definitely earn one of my remaining slots. The current OS courses are already considered some of the best, and this would be a great addition. Fingers crossed.
Implementing a simple filesystem using the Linux VFS interface is a fun thing to do. You can start by implementing the bare minimum and then add more functions over time.
Yes, it is C, not Rust, but for systems work it is absolutely worth knowing.
I probably would. I’m also in OMSCS and the two operating systems classes offered cover a very different spectrum (GIOS is more about learning the Linux OS interface and AOS is about experimental concepts in OS development). There isn’t a “back to basics” OS class unfortunately.
Thanks for feedback, I am considering both (a) Linux interface (b) Back to basics building at least a decent multitasking kernel with memory management.
I think building some sort of OS from scratch would be a wonderful class. I've actually thought about what _I_ would like to see in a class like this before. These ideas might be useful to you:
1. Use a widely available architecture. This practically means x86 or x86_64. Nothing against RPis, for example, it's just that _everyone_ is more likely to have some sort of Intel desktop/laptop before they even have an RPi.
2. Start from the very basics: booting up and go into a NOP loop should be one of the first lessons.
3. Don't need to go too far: basic but functional implementations of things like memory management, multitasking, file systems, etc. are enough.
4. By the end, have a simple OS that boots up to a basic shell, is capable of reading/writing to something like FAT16 and can run multiple tasks in parallel.
We definitely need more course that go down to deep specifics of how OSes work, are implemented.
(I feel like Tanenbaum's Minix book the last excellent piece of literature in the area that came closest. But of course, if you're aware of other literature on this, let me know!)
Thank you for feedback. Do you think $49 - $79 would be justified for a %100 practical course, with about 2.5 hours of dense (not sparse to fill time) material?
FAT12 is really simple (and limited) . I have implemented a driver for it from scratch back in the day, in assembler and then later in C. Taught me a lot!
The Reference Materials section has some nice tutorials, including one written by my colleague: Making a RISC-V Operating System using Rust, which has been discussed on HN several times.
> The labs used in CS3210 are largely based on the materials originally developed for CS140e: An Experimental Course on Operating Systems by Sergio Benitez.
Networking drivers and APIs are nice to have - they are often omitted in OS project assignments because it's hard to fit them into the course schedule.
However for an IoT/embedded OS networking is pretty essential.
I'll also have to say that the course labs look far more interesting than they were a decade ago. Implementing a new linux syscall to readtsc isn't particularly exciting...
CS 3210 & 6210 were my favorite undergrad courses.
Incredibly frustrating, but I learned more general concepts in each semester than in anything else.
I still remember trying to decide between 6210 and another elective. I asked Bill Leahy, who in typically efficiency replied, "Well, Tom Conte has a Porsche and a Ferrari." I figured that was a fair criteria in deciding who to learn from.
I'm really impressed. When I took the course ~1.5 years ago it was still cribbing heavily from MIT OCW's OS course. Really nice to see the curriculum has changed (and more importantly been reduced)!
Is there an equivalent course in C or C++? I would be interested to take it if that was the case (nothing against Rust, I just don't see myself learning a new language just for a course)