Why I'm building an operating system
Tags: programming, systems, cpp
Published: 2022-12-15 08:00:26

#### **Why I’m building an operating system**

Operating systems are a fundamental part of all computing systems. They enable us run our programs and manage the resources of the computer while the programs are running, they handle scheduling of tasks and memory allocation. Modern operating systems often provide a graphical user interface that allows non technical users to interact with the operating system through dynamic interactive graphical components. My reason for building an operating system is quite simple, there isn’t a more challenging technical project, understanding how operating systems are built will provide you with the knowledge to build more powerful and technically challenging application level programs because you’ll understand how everything works from the system level. Another reason I’ve decided to build an operating system is the journey and all the other concepts I will pick up along the way, building an operating systems involves a deep technical understanding of other concepts such as algorithms and data structures, networking, information theory, computer architecture and so on. For these reasons I believe building an operating systems would be both exciting and intellectually stimulating.

I would be using the [OSDev wiki site](https://wiki.osdev.org/Main_Page) as guide as I embark on this journey, here are some interesting concepts I have learnt already:

### Kernel

The Kernel is the heart of the operating system, It handles both hardware and software interrupts. It has abstractions for certain entities such as files, processes, memory, directories etc which are represented using an internal state in the kernel. Applications interact with these abstractions using system calls, system calls can be seen as functions used to interact with the data abstractions. System calls are not called directly by application programs, except maybe you are writing assembly code, system calls are made using c/c++ libraries which abstract the parameters required for making the system calls from the programmer. 

### Shell

The shell is an application program that is usually distributed with the operating system, it is primarily used for providing an interface for users to start other application programs and explore other files and programs available on the file system, It is not part of the operating system or the kernel. The shell is an application level program, it executes on the user space and not the kernel space, it performs its operations by performing numerous system calls. The shell may also implement a scripting language that will enable users to write scripts that execute certain instructions on the shell.

### GUI

The graphical user interface is an application level program that is usually distributed with operating systems that use them. They are used for rendering and drawing on the the users screen, it is also responsible for handling input from the keyboard and mouse, and performing the appropriate required action, GUIs are not important for all operating systems, some are solely shell based, but the question is how do most modern operating systems use both shells and GUIs? Two essential subsystems are the widget manager and the the widget library.

**Window Manager**

The window manager is used for positioning, shaping and sizing of windows on the user interface. 

**Widget Library**

This is a subsystem used for enabling applications to build user interfaces to be used on the graphical user interface.

I'll be posting my progress, learnings and failures here to keep you guys on the know and keep myself accountable. If you're interested in joining me on this journey please reach out, it will be fun.