aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNatasha Moongrave <natasha@256phi.eu>2026-03-27 21:03:32 +0100
committerNatasha Moongrave <natasha@256phi.eu>2026-03-27 21:03:32 +0100
commit1f645efcf12191af26d0842699ab2633641a7b16 (patch)
tree8a8ae1581051bf07f49012a95b4724c7e994a2f4
parent137066ae93a4d81bd3e1aeb5e43013f2b17b0510 (diff)
Add roadmap.md for plan
-rw-r--r--roadmap.md250
1 files changed, 250 insertions, 0 deletions
diff --git a/roadmap.md b/roadmap.md
new file mode 100644
index 0000000..f8dc323
--- /dev/null
+++ b/roadmap.md
@@ -0,0 +1,250 @@
+# Strix OS Roadmap: Linux Application Compatibility
+
+This roadmap outlines the path from the current kernel state to full Linux application compatibility.
+
+## Current State
+
+The kernel has a solid foundation:
+- GDT/TSS/IDT properly configured
+- Interrupt handling (timer, keyboard, page fault exceptions)
+- VGA text mode output + serial debugging
+- PS/2 keyboard input with scancode translation
+
+**Missing for Linux compatibility**: heap allocation, paging control, user-space, syscalls, processes, VFS, ELF loader.
+
+---
+
+## Phase 1: Memory Management
+
+### 1.1 - Page Table Access
+- [ ] Access bootloader's page tables via BootInfo
+- [ ] Implement page table walking (translate virtual → physical)
+- [ ] Create OffsetPageTable or RecursivePageTable mapper
+- **Files**: `src/memory.rs`
+
+### 1.2 - Frame Allocator
+- [ ] Parse memory map from bootloader
+- [ ] Implement FrameAllocator trait
+- [ ] Track used/free physical frames (bitmap or linked list)
+- **Files**: `src/memory/frame_allocator.rs`
+
+### 1.3 - Heap Allocator
+- [ ] Map heap region in virtual memory
+- [ ] Implement GlobalAlloc (linked_list_allocator crate or custom)
+- [ ] Enable alloc crate (Vec, Box, String, etc.)
+- **Files**: `src/allocator.rs`
+
+**Dependencies to add:**
+```toml
+linked_list_allocator = "0.9.0"
+```
+
+---
+
+## Phase 2: User Space Foundation
+
+### 2.1 - Ring 3 Transition
+- [ ] Set up user-mode GDT segments (ring 3 code/data)
+- [ ] Create per-process page tables
+- [ ] Implement context switch (save/restore registers)
+- [ ] Use IRET to jump to ring 3
+- **Files**: `src/gdt.rs` (extend), `src/task/mod.rs`
+
+### 2.2 - System Call Interface
+- [ ] Set up SYSCALL/SYSRET MSRs (STAR, LSTAR, SFMASK)
+- [ ] Create syscall entry point in assembly
+- [ ] Implement syscall dispatcher
+- [ ] Start with: write, exit, mmap (minimal set)
+- **Files**: `src/syscall/mod.rs`, `src/syscall/handler.S`
+
+### 2.3 - Basic Process Structure
+- [ ] Process struct (pid, page table, registers, state)
+- [ ] Process list/table
+- [ ] Simple round-robin scheduler
+- [ ] fork() and exit() syscalls
+- **Files**: `src/task/process.rs`, `src/task/scheduler.rs`
+
+---
+
+## Phase 3: ELF Loading & exec()
+
+### 3.1 - ELF Parser
+- [ ] Parse ELF64 header and program headers
+- [ ] Identify PT_LOAD segments
+- [ ] Handle static binaries first
+- **Files**: `src/loader/elf.rs`
+
+### 3.2 - execve() Implementation
+- [ ] Load ELF into fresh address space
+- [ ] Set up user stack with argc/argv/envp
+- [ ] Set up auxiliary vector (AT_ENTRY, AT_PHDR, etc.)
+- [ ] Jump to entry point
+- **Files**: `src/syscall/exec.rs`
+
+**Dependencies to add:**
+```toml
+xmas-elf = "0.9.0" # or goblin for ELF parsing
+```
+
+---
+
+## Phase 4: Virtual File System
+
+### 4.1 - VFS Layer
+- [ ] Define File, Inode, Superblock traits
+- [ ] File descriptor table per process
+- [ ] open(), read(), write(), close(), lseek()
+- **Files**: `src/fs/vfs.rs`, `src/fs/fd.rs`
+
+### 4.2 - In-Memory Filesystems
+- [ ] ramfs/tmpfs for root filesystem
+- [ ] devfs (/dev/null, /dev/zero, /dev/console)
+- [ ] procfs (/proc/self/*, /proc/[pid]/*)
+- **Files**: `src/fs/ramfs.rs`, `src/fs/devfs.rs`, `src/fs/procfs.rs`
+
+### 4.3 - Disk Filesystem
+- [ ] ATA/AHCI driver
+- [ ] ext2/ext4 read support (start read-only)
+- [ ] mount() syscall
+- **Files**: `src/drivers/ata.rs`, `src/fs/ext2.rs`
+
+---
+
+## Phase 5: POSIX Essentials
+
+### 5.1 - Signals
+- [ ] Signal delivery mechanism
+- [ ] Default handlers (SIGKILL, SIGTERM, SIGSEGV)
+- [ ] sigaction(), kill() syscalls
+- **Files**: `src/task/signal.rs`
+
+### 5.2 - Pipes & IPC
+- [ ] pipe() syscall
+- [ ] dup(), dup2() for fd manipulation
+- [ ] Anonymous pipes for shell support
+- **Files**: `src/fs/pipe.rs`
+
+### 5.3 - Wait & Process Groups
+- [ ] wait4(), waitpid() syscalls
+- [ ] Process groups, sessions
+- [ ] Foreground/background processes
+- **Files**: `src/task/wait.rs`
+
+---
+
+## Phase 6: Init System Support (OpenRC)
+
+### 6.1 - Required Syscalls & Filesystems
+- [ ] mount(), umount() syscalls
+- [ ] Working /proc and /sys
+- [ ] chroot(), pivot_root()
+- [ ] Basic TTY/PTY support
+- **Files**: `src/syscall/mount.rs`, `src/fs/sysfs.rs`
+
+### 6.2 - Device Management
+- [ ] /dev population (static or dynamic)
+- [ ] ioctl() for device control
+- [ ] Console/TTY driver
+- **Files**: `src/drivers/tty.rs`
+
+---
+
+## Suggested Directory Structure
+
+```
+src/
+├── main.rs
+├── lib.rs
+├── memory/
+│ ├── mod.rs
+│ ├── paging.rs
+│ ├── frame_allocator.rs
+│ └── heap.rs
+├── task/
+│ ├── mod.rs
+│ ├── process.rs
+│ ├── scheduler.rs
+│ ├── context.rs
+│ └── signal.rs
+├── syscall/
+│ ├── mod.rs
+│ ├── handler.rs
+│ ├── table.rs # syscall number → handler mapping
+│ ├── fs.rs # open, read, write, close
+│ ├── process.rs # fork, exec, exit, wait
+│ └── memory.rs # mmap, munmap, brk
+├── fs/
+│ ├── mod.rs
+│ ├── vfs.rs
+│ ├── fd.rs
+│ ├── ramfs.rs
+│ ├── devfs.rs
+│ └── procfs.rs
+├── loader/
+│ └── elf.rs
+└── drivers/
+ ├── tty.rs
+ └── ata.rs
+```
+
+---
+
+## Linux Syscall Priority List
+
+Essential syscalls to implement (roughly in order of importance):
+
+### Tier 1 - Minimal Execution
+| Syscall | Number | Purpose |
+|---------|--------|---------|
+| write | 1 | Output to console/files |
+| exit | 60 | Terminate process |
+| exit_group | 231 | Terminate all threads |
+| brk | 12 | Heap memory allocation |
+| mmap | 9 | Memory mapping |
+| munmap | 11 | Unmap memory |
+
+### Tier 2 - Process Management
+| Syscall | Number | Purpose |
+|---------|--------|---------|
+| fork | 57 | Create child process |
+| clone | 56 | Create thread/process |
+| execve | 59 | Execute program |
+| wait4 | 61 | Wait for child |
+| getpid | 39 | Get process ID |
+| getppid | 110 | Get parent PID |
+
+### Tier 3 - File Operations
+| Syscall | Number | Purpose |
+|---------|--------|---------|
+| read | 0 | Read from fd |
+| open | 2 | Open file |
+| close | 3 | Close fd |
+| stat | 4 | File information |
+| fstat | 5 | File info by fd |
+| lseek | 8 | Seek in file |
+| dup | 32 | Duplicate fd |
+| dup2 | 33 | Duplicate to specific fd |
+| pipe | 22 | Create pipe |
+| ioctl | 16 | Device control |
+
+### Tier 4 - Signals & Advanced
+| Syscall | Number | Purpose |
+|---------|--------|---------|
+| rt_sigaction | 13 | Signal handlers |
+| rt_sigprocmask | 14 | Block signals |
+| kill | 62 | Send signal |
+| getcwd | 79 | Current directory |
+| chdir | 80 | Change directory |
+| mount | 165 | Mount filesystem |
+| umount2 | 166 | Unmount filesystem |
+
+---
+
+## Resources
+
+- [Linux x86_64 Syscall Table](https://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/)
+- [OSDev Wiki](https://wiki.osdev.org/)
+- [Writing an OS in Rust (blog_os)](https://os.phil-opp.com/)
+- [POSIX.1-2017 Specification](https://pubs.opengroup.org/onlinepubs/9699919799/)
+- [musl libc source](https://musl.libc.org/) - Clean syscall reference
+- [Linux kernel source](https://github.com/torvalds/linux) - `arch/x86/entry/syscalls/syscall_64.tbl`