One of my areas of research is Operating System Development. It's something I'm quite passionate about, and a lot of fun. It's very rewarding to be working with the core of what a computer is. ## What is an Operating System? An operating system can be simply defined as software that controls access to the hardware of a computer. This can be done in many ways, some of them quite specialized. Generally, the *kernel* is the closest layer to the hardware. It gates access to hardware devices, controls memory mapping, and creates abstractions to hardware via it's *hardware abstraction layer (HAL)*. Commonly, the concept of a *process* or *thread* is in the kernel, which has a *scheduler* designed to multiplex access to the most important resource on the computer -- the *CPU*. On top of the kernel, system services, device drivers, and system libraries need to be created to provide adequate operating-system level services to user programs (if the OS has user programs, of course). This information usually needs to be loaded in a structured way to memory, so a *virtual file system* is created, with files being loaded from some source. Essentially, an operating system is the entire collection of software written to make a complete software platform. >[!example] explorer.exe is a program running under the NT kernel on Windows. explorer.exe is included with the operating system, and serves a function as part of the "package". So, it's part of the operating system. >[!example] Google Chrome, an aftermarket software package, uses operating system services, but was not included, so it's not part of the OS. ## The Kernel The kernel multiplexes hardware to entities usually called *processes*, *jobs* or *threads*. These are separate execution contexts. The kernel's purpose is to provide: * Security * Stability * Fairness * Reactivity for these processes. ## References