Skip to content

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

License

Notifications You must be signed in to change notification settings

Zhuagenborn/Tiny-x86-OS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

56 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Tiny x86 Operating System in C++

C++ NASM Make GitHub Actions Linux License

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
  2. Building the System

Boot

  1. Master Boot Record
  2. Loader

Kernel

  1. Interrupts
  2. System Calls
  3. Threads
  4. Memory
  5. File System
  6. User Processes

References

Structure

.
β”œβ”€β”€ 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.

About

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

Topics

Resources

License

Stars

Watchers

Forks

Languages