I'm 17 and interested in creating a small operating system on my own. I don't have a specific purpose for it yet—I mostly want to take on an extremely difficult project, learn a lot about computers, and become a much better programmer. I know it could take years, but I'm wondering whether finishing a basic version by the end of college is realistic if I work on it during part of my free time. My only programming experience so far is making games in Unity with C#. Where should I start? Should I learn C, assembly, computer architecture, or operating-system theory first? What smaller projects would prepare me for writing a kernel?
4 Answers
Keep the goal, but drop the long-term schedule. College, work, relationships, and other responsibilities will make your available time unpredictable, so there may be months when the project sits untouched. A better progression would be: learn general programming, get comfortable with C, study assembly and CPU architecture, build a scheduler or memory allocator, and then start a tiny kernel. A desktop environment can be a distant milestone rather than the starting requirement.
Microcontrollers are a good stepping stone because they let you interact directly with hardware without the complexity of a modern PC. Try bare-metal programming on an inexpensive Arduino, ESP32, or similar board. You’ll learn about memory, registers, timers, input and output, and hardware constraints. After that, experimenting with a bootloader or tiny kernel in an emulator will be much less overwhelming.
The best way to find out whether this is for you is to build one small piece instead of planning the entire system. A round-robin process scheduler, a command-line shell, a simple filesystem, or a program that runs without an operating system would all be useful projects. Once you finish one, you’ll have a much clearer idea of what an OS actually does and what you want your own system to be for.
That’s ambitious, but not delusional—as long as you define “operating system” realistically. Don’t begin by trying to recreate Windows or Linux. Start by learning C, pointers, memory management, data structures, and basic computer architecture. Then make small milestones: boot a kernel in an emulator, print text, read keyboard input, handle interrupts, allocate memory, and eventually add a simple filesystem. Studying a small teaching OS such as xv6 and using a good operating-system development guide can help a lot. Even if you never finish, you’ll learn an enormous amount by building each component.
That makes sense. I’m going to learn C first and work through smaller projects instead of jumping straight into a full desktop system.

I hadn’t considered how much my schedule could change over the next several years. I’ll treat it as a long-term learning project instead of promising myself a specific completion date.