mirror of
https://github.com/cfenollosa/os-tutorial.git
synced 2024-10-27 20:34:19 +00:00
ce8e050d24
Closes #269
97 lines
4.1 KiB
Markdown
97 lines
4.1 KiB
Markdown
os-tutorial
|
||
===========
|
||
|
||
_⚠️ Hey! This is an old, abandoned project, with both technical and design issues [listed here](https://github.com/cfenollosa/os-tutorial/issues/269). Please have fun with this tutorial but do look for more modern and authoritative sources if you want to learn about OS design. ⚠️_
|
||
|
||
How to create an OS from scratch!
|
||
|
||
I have always wanted to learn how to make an OS from scratch. In college I was taught
|
||
how to implement advanced features (pagination, semaphores, memory management, etc)
|
||
but:
|
||
|
||
- I never got to start from my own boot sector
|
||
- College is hard so I don't remember most of it.
|
||
- I'm fed up with people who think that reading an already existing kernel, even if small, is
|
||
a good idea to learn operating systems.
|
||
|
||
Inspired by [this document](http://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf)
|
||
and the [OSDev wiki](http://wiki.osdev.org/), I'll try to make short step-by-step READMEs and
|
||
code samples for anybody to follow. Honestly, this tutorial is basically the first document but
|
||
split into smaller pieces and without the theory.
|
||
|
||
Updated: more sources: [the little book about OS development](https://littleosbook.github.io),
|
||
[JamesM's kernel development tutorials](https://web.archive.org/web/20160412174753/http://www.jamesmolloy.co.uk/tutorial_html/index.html)
|
||
|
||
|
||
Features
|
||
--------
|
||
|
||
- This course is a code tutorial aimed at people who are comfortable with low level computing. For example,
|
||
programmers who have curiosity on how an OS works but don't have the time or willpower to start reading the Linux kernel
|
||
top to bottom.
|
||
- There is little theory. Yes, this is a feature. Google is your theory lecturer. Once you pass college,
|
||
excessive theory is worse than no theory because it makes things seem more difficult than they really are.
|
||
- The lessons are tiny and may take 5-15 minutes to complete. Trust me and trust yourself. You can do it!
|
||
|
||
|
||
How to use this tutorial
|
||
------------------------
|
||
|
||
1. Start with the first folder and go down in order. They build on previous code, so if
|
||
you jump right to folder 05 and don't know why there is a `mov ah, 0x0e`, it's because you missed lecture 02.
|
||
Really, just go in order. You can always skip stuff you already know.
|
||
|
||
2. Open the README and read the first line, which details the concepts you should be familiar with
|
||
before reading the code. Google concepts you are not familiar with. The second line states the goals for each lesson.
|
||
Read them, because they explain why we do what we do. The "why" is as important as the "how".
|
||
|
||
3. Read the rest of the README. It is **very concise**.
|
||
|
||
4. (Optional) Try to write the code files by yourself after reading the README.
|
||
|
||
5. Look at the code examples. They are extremely well commented.
|
||
|
||
6. (Optional) Experiment with them and try to break things. The only way to make sure you understood something is
|
||
trying to break it or replicate it with different commands.
|
||
|
||
|
||
TL;DR: First read the README on each folder, then the code files. If you're brave, try to code them yourself.
|
||
|
||
|
||
Strategy
|
||
--------
|
||
|
||
We will want to do many things with our OS:
|
||
|
||
- Boot from scratch, without GRUB - DONE!
|
||
- Enter 32-bit mode - DONE
|
||
- Jump from Assembly to C - DONE!
|
||
- Interrupt handling - DONE!
|
||
- Screen output and keyboard input - DONE!
|
||
- A tiny, basic `libc` which grows to suit our needs - DONE!
|
||
- Memory management
|
||
- Write a filesystem to store files
|
||
- Create a very simple shell
|
||
- User mode
|
||
- Maybe we will write a simple text editor
|
||
- Multiple processes and scheduling
|
||
|
||
Probably we will go through them in that order, however it's soon to tell.
|
||
|
||
If we feel brave enough:
|
||
|
||
- A BASIC interpreter, like in the 70s!
|
||
- A GUI
|
||
- Networking
|
||
|
||
|
||
|
||
Contributing
|
||
------------
|
||
|
||
This is a personal learning project, and even though it hasn't been updated for a long time, I still have hopes to get into it at some point.
|
||
|
||
I'm thankful to all those who have pointed out bugs and submitted pull requests. I will need some time to review everything and I cannot guarantee that at this moment.
|
||
|
||
Please feel free to fork this repo. If many of you are interested in continuing the project, let me know and I'll link the "main fork" from here.
|