I'm 17 and currently have some experience making games in Unity with C#, but I want to take on a much harder project: creating a small operating system by myself. I know it could take years, and I'm not expecting to compete with Windows or Linux. I mainly want to learn more about computers, improve my programming, and build something challenging. I'd probably spend part of my free time on it rather than treating it as my only activity.
Where should I begin? Should I learn C, assembly, computer architecture, or operating-system theory first? Are there smaller projects I should complete before attempting a bootable kernel? Any recommended books, courses, or practical exercises would be helpful. I'm also considering documenting my progress so I can track what I learn.
3 Answers
It’s ambitious, but not delusional as long as you define the goal realistically. Don’t start by trying to build a complete desktop operating system. Begin with C and learn pointers, memory management, data structures, and how programs interact with hardware. Then study computer architecture and some assembly.
For practical milestones, try writing a bootable kernel that prints text in an emulator such as QEMU. From there, add keyboard input, interrupts, memory allocation, a simple scheduler, and eventually a basic filesystem. The OSDev Wiki and MIT’s xv6 are useful learning resources. Even if you never finish, the project will teach you an enormous amount.
The main unrealistic part is trying to predict that you’ll spend a fixed percentage of your free time on this for the next several years. College, work, relationships, and other responsibilities will change your schedule, so drop the deadline and let the project grow at its own pace.
You can start now, but first make sure you understand what an operating system actually does: manages processes, memory, devices, storage, permissions, and communication between software and hardware. Build ordinary programs in Python or C, learn how computers execute instructions, and gradually move lower level. A small experimental OS is a realistic long-term learning project; a polished Windows or Linux replacement is a very different goal.
I’m not aiming to replace existing systems. I mostly want a difficult project that teaches me how computers work, so I’ll focus on small milestones and document the progress rather than setting a strict completion date.
Microcontrollers are a good way to get comfortable with low-level programming before dealing with a full PC operating system. Try an inexpensive Arduino or ESP32 board and write bare-metal programs that interact with buttons, LEDs, timers, and sensors. You’ll learn about memory, registers, interrupts, and hardware constraints in a much smaller environment.
After that, you could write projects such as a round-robin process scheduler or a small command interpreter. These give you experience with individual OS components without having to solve booting, drivers, filesystems, and hardware support all at once.

That makes sense. I’m going to learn C first and start with smaller low-level projects instead of jumping straight into a full desktop system.