Roadmap
Development plan from bare-metal boot to self-hosting OS.
Table of contents
Sprint Overview #
| Sprint | Focus | Status | Description |
|---|---|---|---|
| 1 | Boot & Serial | ✅ Complete | Toolchain, bootloader, serial UART, framebuffer console |
| 2 | Memory | ✅ Complete | PMM bitmap allocator, VMM page tables, kernel heap |
| 3 | Interrupts | ✅ Complete | GDT/TSS, IDT, ACPI/MADT, LAPIC, I/O APIC, W^X remap |
| 4 | Scheduler | 🔲 Planned | Processes, threads, tickless scheduler, SMP |
| 5 | Capabilities | 🔲 Planned | Capability tables, IPC channels, memory grants |
| 6 | Syscalls | 🔲 Planned | SYSCALL/SYSRET, ELF loader, Ring 3 entry |
| 7 | Userspace | 🔲 Planned | Init process, libmnos, first userspace driver |
Sprint 1 — Boot & Serial Output ✅ #
Get the kernel running, prove it with visible output.
- Rust nightly toolchain configuration (
rust-toolchain.toml) - Cargo workspace with kernel crate, dev/release profiles
.cargo/config.toml— bare-metal target, kernel code-model, no SSE/AVX, build-std- Linker script — higher-half kernel, page-aligned sections
- Limine bootloader configuration
- IRQ-safe ticket spinlock
PhysAddr/VirtAddrnewtypes with HHDM translation- COM1 serial UART driver — 16550, 115200 baud 8N1
- CPU primitives — halt, CR2/CR3, INVLPG, RDTSC, MSRs
- Limine boot protocol interface
kprint!/kprintln!logging macros- Kernel panic handler
- Framebuffer text console — 8×16 bitmap font, scrolling
- Kernel entry point — 5-phase boot
- Makefile build system
- Boots in QEMU with UEFI
Sprint 2 — Memory Management ✅ #
Teach the kernel to manage physical and virtual memory.
- Physical Memory Manager — bitmap allocator (alloc, free, zeroed, contiguous)
- VMM page table infrastructure (map, unmap, translate)
- Kernel Heap — linked-list allocator with coalescing, enables
alloccrate - Linker script fix —
.gotsection handling - Kernel higher-half remap (completed in Sprint 3)
- W^X enforcement via remap (completed in Sprint 3)
Sprint 3 — Interrupts & Exceptions ✅ #
Handle CPU exceptions and hardware interrupts safely.
- GDT — kernel/user segments, TSS with IST1 guard page, SYSRET layout
- IDT — 15 exception handlers + 16 IRQ stubs + spurious @255 (swapgs + SysV ABI)
- ACPI — XSDT-first MADT parser, Limine rev3 HHDM gap fix
- LAPIC — CPUID 0x15 + PIT calibration, one-shot mode, spurious handler
- I/O APIC — MADT parsing, IRQ routing, legacy PIC disable
- W^X remap — in-place page table update (.text=R+X, .rodata=R, .data/.bss=R+W+NX)
Sprint 4 — Processes & Scheduler 🔲 #
Run multiple threads of execution, share the CPU fairly.
- Process / Thread structures — address space, capability table, state machine
- Context switching — register save/restore, CR3 switch, FPU lazy state
- Tickless scheduler — per-core run queues, work-stealing, idle thread
- SMP initialization — INIT/SIPI, per-core GDT/IDT/TSS/LAPIC
Sprint 5 — Capabilities & IPC 🔲 #
The security model — unforgeable tokens and message passing.
- Capability table — per-process, slot-based, typed with rights bitmask
- Capability operations — create, delete, transfer (rights reduction), revoke
- Synchronous IPC — send/receive on capability-protected endpoints
- Call/Reply RPC — synchronous request-response pattern
- Notifications — lightweight non-blocking event signaling
- Zero-copy memory grants — share physical pages via capabilities
Sprint 6 — Syscall Interface & Userspace 🔲 #
Cross the Ring 0/Ring 3 boundary.
- SYSCALL/SYSRET — MSR configuration, entry point, register save/restore
- Syscall dispatch — ~22 syscalls indexed by RAX
- ELF loader — parse ELF64, map segments, set up user stack
- Ring 3 entry — user page tables, SYSRET to entry point
Sprint 7 — Init Process & First Program 🔲 #
Life outside the kernel.
- Init process — capability receiver, service spawner, name directory
- Userspace library (
libmnos) — syscall wrappers, IPC helpers, allocator - First userspace driver — serial console via IRQ capability + IPC
Future Milestones #
These features are planned for after Sprint 7 completes the core OS:
| Milestone | Description |
|---|---|
| VFS Service | Virtual filesystem abstraction in userspace |
| Initramfs | In-memory tar filesystem for boot-time binaries |
| Disk Driver | AHCI/NVMe driver in userspace |
| Filesystem | ext2 or FAT32 implementation as userspace service |
| Networking | TCP/IP stack as a userspace service |
| Shell | Basic interactive command-line shell |
| USB HID | Keyboard and mouse drivers |
| GPU Driver | Intel HD 405 framebuffer driver |
| Compositor | Window manager / display server |
| Rust std Port | Port Rust's standard library to MinimalOS |
| Self-hosting | Compile MinimalOS on MinimalOS |
Contributing #
Contributions are welcome! The project is structured around sprints — each sprint focuses on a self-contained subsystem.
How to Contribute
- Check the current sprint's open items above
- Read the relevant subsystem documentation
- Fork the repository and create a feature branch
- Implement your changes with tests where applicable
- Submit a pull request
Development Guidelines
- Rust edition 2024 with
no_std— no standard library - No unsafe without justification — document why each
unsafeblock is sound - Comments explain WHY, not what — assume the reader knows Rust
- One commit per logical change — granular, descriptive commit messages
- Test in QEMU —
make runbefore submitting