I've been working on a hobby operating system called NoviumOS. It currently supports x86_32 bit architecture and it uses GRUB as the bootloader.
Here are some of the features it has:
- Boot Chain: GRUB multiboot header, bootstrap.S sets the stack, clears BSS, and hands off to C (linked at 1MiB via custom linker script).
- Page Allocator: A 4GiB bitmap allocator that parses the GRUB memory map. Flat 4GiB paging with statically allocated 4KB pages.
- Sub-page Heap: A basic multi-page sub-page heap allocator. It uses a 16-byte BlockMeta header with magic numbers, a sorted doubly linked free list, 8-byte alignment, immediate left/right coalescing, and boundary-tag updates after splits/merges.
- Preemptive Round Robin Scheduler: Supports up to 32 tasks with priorities. Task structures track saved EIP/ESP/EBP. Implements create, yield, block, unblock, sleep-until-tick, and kill. EFLAGS are preserved properly, and context switching is deferred until after the PIC EOI.
- VGA Text Console & Keyboard: An 80x25 text console that you can type in, featuring hardware cursor handling, scrolling, and a PS/2 keyboard driver with a 32-entry ring buffer.
- Libc Subset: Basic string functions and a custom kprintf supporting %c, %s, %d, %i, %u, %x, %X, and %%.
It still has no filesystem, IPC or userspace yet.
Bottleneck im currently fixing: My heap starts at physical `0x1000` in low memory, and `HeapGrow` only extends at the current heap end, so it's permanently capped at ~620KB with 60MB free above 1MB.
Heres the github repo link: https://github.com/alexdev8930/NoviumOS