This project is an educational platform for step-by-step learning and development of basic operating system components. The goal is not to create a fully functional OS, but to understand how its key mechanisms work "from the inside."
-
IDT initialization and interrupt handling (CPU exceptions + IRQs).
-
PIC remapping and sending EOI.
-
PIT (timer) — initialization and handler, incrementing uptime (seconds).
-
RTC — reading the current time (accounting for BCD/12h/24h formats, timezone offset).
-
VGA console: character output, scrolling, hardware cursor.
-
Keyboard handler: scan-code → ASCII, Shift/CapsLock, Backspace, Enter, string input with prompt.
-
System call vector (
0x80) is already connected in the IDT — framework ready. -
Add a syscall for string output to the terminal (
sys_write). -
Memory allocator.
-
Add power off and reboot to kernel.
-
Multitasking.
-
Create terminal.
-
Implement a basic file system.
-
Make the terminal a separate application rather than part of the kernel.
-
Implement Long mode
-
Implement working multitasking for Long mode (x86_64)
-
Rewrite terminal to (NASM x86_64).
-
Check syscall operation (status working)
-
Build kernel in iso with GRUB
-
Added support for BIOS and UEFI (Multiboot2).
-
Added commands
ls,cd,pwdfor working with the file system and moving around directories. -
Added graphics mode with screen resolution support.
-
Added sleep support to power modes.
- htop - prints information about the heap
- clear - clears the terminal
- shutdown - system shutdown (On all virtual machines, 100% performance is guaranteed; on real hardware, 100% performance is not guaranteed.)
- reboot - system reboot
- help - displays a list of commands
- time - displays the current system time and uptime
Build:
make
-
All build artifacts (.o files and final binary) are placed in the
build/folder. -
Final binary:
build/kernel.
Run in QEMU:
- Regular run (executes
build/kernel):
make run
- Debug run with serial (
stdout) output — useful for viewing kernel output and entering commands:
make debug
Build with GRUB:
- Make sure you have the necessary tools installed:
sudo apt install grub-pc-bin xorriso mtools
- Compile the project and generate the
build/kernelandiso/boot/kernelfiles:
make
- Use
grub-mkrescueto package the kernel into a bootable ISO image:
grub-mkrescue -o kernel.iso iso
- Run the generated ISO using QEMU:
qemu-system-x86_64 -cdrom kernel.iso -m 1024M
Additional QEMU options:
- You can pass options to QEMU via the
QEMU_OPTSvariable. Examples:
# Run with gdb stub and 512MB RAM
make run QEMU_OPTS="-s -S -m 512"
# debug + gdb
make debug QEMU_OPTS="-s -S"
Note: -s -S enables the gdb stub and halts the CPU until the debugger is attached.
Clean build:
make clean
This will remove build/ and all build artifacts.
| Code (rax) | arg1 (rdi) | arg2 (rsi) | arg3 (rdx) | arg4 (r10) | arg5 (r8) | arg6 (r9) | return |
|---|---|---|---|---|---|---|---|
| (0) print_char_position | char | x | y | fg | bg | 0 | |
| (1) print_string_position | *str | x | y | fg | bg | 0 | |
| (2) print_char | char | fg | bg | 0 | |||
| (3) print_string | *str | fg | bg | 0 | |||
| (4) backspace | 0 | ||||||
| (5) get_time | value | *buf | *prt | ||||
| (10) malloc | size | *prt | |||||
| (11) free | *prt | 0 | |||||
| (12) realloc | *prt | size | *ptr | ||||
| (13) get_malloc_stats | *prt | 0 | |||||
| (30) get_char | char | ||||||
| (31) set_pos_cursor | x | y | 0 | ||||
| (100) power_off | |||||||
| (101) reboot_system | |||||||
| (200) task_create | *str | pid | |||||
| (201) task_list | *buf | max | quantity | ||||
| (202) task_stop | pid | status | |||||
| (203) task_reap_zombies | 0 | ||||||
| (204) task_exit | exit_code | 0 | |||||
| (205) task_is_alive | pid | status |
