Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/zhuagenborn/tiny-x86-os

πŸ’½ A tiny Intel x86 operating system writtrn in assembly and C++, supporting interrupts, memory paging and heap allocation, disk control, file partition, system calls, thread scheduling, etc.
https://github.com/zhuagenborn/tiny-x86-os

assembly cpp20 disk-management interrupt kernel memory-management opertaing-system thread-scheduling

Last synced: 6 days ago
JSON representation

πŸ’½ A tiny Intel x86 operating system writtrn in assembly and C++, supporting interrupts, memory paging and heap allocation, disk control, file partition, system calls, thread scheduling, etc.

Awesome Lists containing this project

README

        

# Tiny *x86* Operating System in *C++*

![C++](docs/badges/C++.svg)
![NASM](docs/badges/NASM.svg)
![Make](docs/badges/Made-with-Make.svg)
![GitHub Actions](docs/badges/Made-with-GitHub-Actions.svg)
![Linux](docs/badges/Linux.svg)
![License](docs/badges/License-MIT.svg)

## Introduction

This project is a tiny *Intel x86* operating system written in *assembly* and *C++*, developed on *Ubuntu* and *Bochs*.

- Boot
- The master boot record for system startup.
- Memory
- Memory segmentation and paging.
- Virtual memory mapping based on bitmaps.
- Heap management (`std::malloc` and `std::free`) based on memory arenas.
- Interrupts
- Interrupt control based on *Intel 8259A*.
- Timer interrupts based on *Intel 8253*.
- Threads
- Thread scheduling based on timer interrupts.
- Semaphores and locks based on interrupts.
- Processes
- User processes based on *Intel x86* task state segments.
- Fork.
- Graphic
- Character printing in VGA text mode.
- Keyboard
- Keyboard control based on *Intel 8042*.
- The circular keyboard input buffer.
- Disks
- IDE channel and disk control.
- Disk partition scanning.
- File System
- File and directory management based on index nodes.
- System Calls
- Privilege switching and system calls based on interrupts.
- *C/C++*
- Basic *C/C++* standard libraries.

## Contents

### Getting Started

1. [Development Environment](https://github.com/Zhuagenborn/Tiny-x86-OS/blob/main/docs/Getting%20Started/Development%20Environment.md)
2. [Building the System](https://github.com/Zhuagenborn/Tiny-x86-OS/blob/main/docs/Getting%20Started/Building%20the%20System.md)

### Boot

3. [Master Boot Record](https://github.com/Zhuagenborn/Tiny-x86-OS/blob/main/docs/Boot/Master%20Boot%20Record.md)
4. [Loader](https://github.com/Zhuagenborn/Tiny-x86-OS/blob/main/docs/Boot/Loader.md)

### Kernel

5. [Interrupts](https://github.com/Zhuagenborn/Tiny-x86-OS/blob/main/docs/Kernel/Interrupts.md)
6. [System Calls](https://github.com/Zhuagenborn/Tiny-x86-OS/blob/main/docs/Kernel/System%20Calls.md)
7. [Threads](https://github.com/Zhuagenborn/Tiny-x86-OS/blob/main/docs/Kernel/Threads.md)
8. [Memory](https://github.com/Zhuagenborn/Tiny-x86-OS/blob/main/docs/Kernel/Memory.md)
9. [File System](https://github.com/Zhuagenborn/Tiny-x86-OS/blob/main/docs/Kernel/File%20System.md)
10. [User Processes](https://github.com/Zhuagenborn/Tiny-x86-OS/blob/main/docs/Kernel/User%20Processes.md)

## References

- [*γ€Šζ“δ½œη³»η»ŸηœŸθ±‘θΏ˜εŽŸγ€‹ιƒ‘ι’’*](https://github.com/yifengyou/os-elephant)

## Structure

```console
.
β”œβ”€β”€ CITATION.cff
β”œβ”€β”€ Debugging.md
β”œβ”€β”€ LICENSE
β”œβ”€β”€ Makefile
β”œβ”€β”€ README.md
β”œβ”€β”€ docs
β”‚Β Β  β”œβ”€β”€ Boot
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Images
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── loader
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ memory-paging.drawio
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ memory-paging.svg
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ page-directory-table.drawio
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── page-directory-table.svg
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Loader.md
β”‚Β Β  β”‚Β Β  └── Master Boot Record.md
β”‚Β Β  β”œβ”€β”€ Getting Started
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Building the System.md
β”‚Β Β  β”‚Β Β  └── Development Environment.md
β”‚Β Β  β”œβ”€β”€ Kernel
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ File System.md
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Images
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ file-system
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ directory-entries.drawio
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ directory-entries.svg
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ index-node.drawio
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── index-node.svg
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ memory
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ memory-heap.drawio
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ memory-heap.svg
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ memory-pools.drawio
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── memory-pools.svg
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── threads
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ thread-block.drawio
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ thread-block.svg
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ thread-lists.drawio
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ thread-lists.svg
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ thread-switching.drawio
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── thread-switching.svg
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Interrupts.md
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Memory.md
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ System Calls.md
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Threads.md
β”‚Β Β  β”‚Β Β  └── User Processes.md
β”‚Β Β  └── badges
β”‚Β Β  β”œβ”€β”€ C++.svg
β”‚Β Β  β”œβ”€β”€ License-MIT.svg
β”‚Β Β  β”œβ”€β”€ Linux.svg
β”‚Β Β  β”œβ”€β”€ Made-with-GitHub-Actions.svg
β”‚Β Β  β”œβ”€β”€ Made-with-Make.svg
β”‚Β Β  └── NASM.svg
β”œβ”€β”€ include
β”‚Β Β  β”œβ”€β”€ boot
β”‚Β Β  β”‚Β Β  └── boot.inc
β”‚Β Β  β”œβ”€β”€ kernel
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ debug
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── assert.h
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ descriptor
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ desc.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ desc.inc
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── gdt
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ idx.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── tab.h
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ interrupt
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ intr.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── pic.h
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ io
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ disk
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ disk.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ disk.inc
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ file
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dir.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ file.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ inode.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── super_block.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── ide.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ file
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dir.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ file.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── path.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ io.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keyboard.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ timer.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── video
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ console.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ print.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── print.inc
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ krnl.h
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ krnl.inc
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ memory
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ page.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ page.inc
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── pool.h
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ process
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ elf.inc
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ proc.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── tss.h
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ selector
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sel.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── sel.inc
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ stl
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ algorithm.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ array.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cerron.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cmath.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cstddef.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cstdint.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cstdlib.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cstring.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iterator.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ mutex.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ semaphore.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ source_location.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ span.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ string_view.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ type_traits.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── utility.h
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ syscall
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── call.h
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ thread
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sync.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── thd.h
β”‚Β Β  β”‚Β Β  └── util
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ bit.h
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ bitmap.h
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ block_queue.h
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ format.h
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ metric.h
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ metric.inc
β”‚Β Β  β”‚Β Β  └── tag_list.h
β”‚Β Β  └── user
β”‚Β Β  β”œβ”€β”€ io
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ file
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dir.h
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── file.h
β”‚Β Β  β”‚Β Β  └── video
β”‚Β Β  β”‚Β Β  └── console.h
β”‚Β Β  β”œβ”€β”€ memory
β”‚Β Β  β”‚Β Β  └── pool.h
β”‚Β Β  β”œβ”€β”€ process
β”‚Β Β  β”‚Β Β  └── proc.h
β”‚Β Β  β”œβ”€β”€ stl
β”‚Β Β  β”‚Β Β  └── cstdint.h
β”‚Β Β  └── syscall
β”‚Β Β  └── call.h
└── src
β”œβ”€β”€ boot
β”‚Β Β  β”œβ”€β”€ loader.asm
β”‚Β Β  └── mbr.asm
β”œβ”€β”€ kernel
β”‚Β Β  β”œβ”€β”€ debug
β”‚Β Β  β”‚Β Β  └── assert.cpp
β”‚Β Β  β”œβ”€β”€ descriptor
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ desc.asm
β”‚Β Β  β”‚Β Β  └── gdt
β”‚Β Β  β”‚Β Β  └── tab.cpp
β”‚Β Β  β”œβ”€β”€ interrupt
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ intr.asm
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ intr.cpp
β”‚Β Β  β”‚Β Β  └── pic.cpp
β”‚Β Β  β”œβ”€β”€ io
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ disk
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ disk.cpp
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ file
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dir.cpp
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ file.cpp
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ inode.cpp
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── super_block.cpp
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ide.cpp
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── part.cpp
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ file
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dir.cpp
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ file.cpp
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── path.cpp
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ io.asm
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ io.cpp
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keyboard.cpp
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ timer.cpp
β”‚Β Β  β”‚Β Β  └── video
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ console.cpp
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ print.asm
β”‚Β Β  β”‚Β Β  └── print.cpp
β”‚Β Β  β”œβ”€β”€ krnl.cpp
β”‚Β Β  β”œβ”€β”€ main.cpp
β”‚Β Β  β”œβ”€β”€ memory
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ page.asm
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ page.cpp
β”‚Β Β  β”‚Β Β  └── pool.cpp
β”‚Β Β  β”œβ”€β”€ process
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ proc.cpp
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ tss.asm
β”‚Β Β  β”‚Β Β  └── tss.cpp
β”‚Β Β  β”œβ”€β”€ stl
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cstring.cpp
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ mutex.cpp
β”‚Β Β  β”‚Β Β  └── semaphore.cpp
β”‚Β Β  β”œβ”€β”€ syscall
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ call.asm
β”‚Β Β  β”‚Β Β  └── call.cpp
β”‚Β Β  β”œβ”€β”€ thread
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sync.cpp
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ thd.asm
β”‚Β Β  β”‚Β Β  └── thd.cpp
β”‚Β Β  └── util
β”‚Β Β  β”œβ”€β”€ bitmap.cpp
β”‚Β Β  β”œβ”€β”€ format.cpp
β”‚Β Β  └── tag_list.cpp
└── user
β”œβ”€β”€ io
β”‚Β Β  β”œβ”€β”€ file
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dir.cpp
β”‚Β Β  β”‚Β Β  └── file.cpp
β”‚Β Β  └── video
β”‚Β Β  └── console.cpp
β”œβ”€β”€ memory
β”‚Β Β  └── pool.cpp
└── process
└── proc.cpp
```

## License

Distributed under the *MIT License*. See `LICENSE` for more information.