26 KiB
StarForth → StarshipOS Hybrid Kernel Transformation Plan
Vision
Transform StarForth from a FORTH-79 virtual machine into a UEFI-bootable microkernel for StarshipOS. StarForth.efi IS the kernel - there is no separate kernel image. The FORTH VM runs in ring 0 as the microkernel.
Architecture: StarForth FORTH VM is a ring-0 resident microkernel. FORTH words implement kernel services (memory, scheduling, interrupts). C code provides low-level hardware access when needed, but FORTH is the primary kernel interface.
Key insight: The VM interpreter itself IS the microkernel. Kernel services are FORTH words, not a separate C layer.
Deployment: Both QEMU/virtual machines and real hardware (x86_64, ARM64, RISC-V64).
Philosophy: Pure FORTH environment - no ELF/POSIX compatibility. All system services exposed as FORTH words.
Key Requirements (from Captain Bob)
- UEFI native: StarForth.efi boots via UEFI, calls ExitBootServices(), becomes the kernel
- StarForth IS the kernel: No separate kernel image - the FORTH VM runs in ring 0 as the microkernel
- Ring 0 FORTH: VM interpreter executes in ring 0, FORTH words are kernel services
- Strict ANSI C99: No GNU extensions
- Architecture priority: x86_64 → ARM64 → RISC-V64
- Replaces L4Re: This is the new StarshipOS kernel foundation
- Pure FORTH: No ELF loader, no POSIX compatibility, FORTH processes only
- Target deployment: Both virtual hardware (QEMU) and real hardware equally
- Scope: Full vision including multi-arch, networking (Phase 6), process management
Current StarForth Architecture (Key Insights)
Initialization Flow
main()→ platform init → block I/O → VM initialization (5MB memory, stacks, mutexes)- FORTH-79 word registration (23 modules, ~600 words)
- Physics subsystems: hot-words cache, rolling window, heartbeat, pipelining, SSM L8
- System bootstrap:
vm_interpret("INIT")loads init.4th - Test suite (936+ tests) → REPL
Memory Model
vaddr_tabstraction: VM addresses are byte offsets, not C pointers (excellent for kernel!)- 5MB fixed address space: Dictionary (2MB) | User blocks (1MB) | Logs (2MB)
- Stacks: C arrays in VM struct (not in VM memory)
- Memory accessors:
vm_load_cell(),vm_store_cell()provide clean abstraction
Current Kernel Blockers
- VM memory via
malloc()→ needs kernel allocator - Dictionary headers via
malloc()→ outside VM memory - Physics subsystems via
malloc()→ fragmented allocation - Assumes contiguous C pointer space → needs page-aware access
Platform Abstraction (Already Kernel-Ready!)
- Atomic spinlocks already implemented (L4Re/minimal mode)
- RAM block I/O backend requires no syscalls
- Assembly optimizations all unprivileged (no syscalls, hardware I/O)
- No dynamic allocation in VM core (fixed stacks, bump allocator)
Implementation Phases
Phase 1: UEFI Boot Stub (Minimal Kernel Bootstrap)
Goal: Boot StarForth as a UEFI application, obtain hardware resources, transition to kernel mode.
Duration: 2 weeks
1.1 UEFI Platform Layer
New directory structure:
src/platform/uefi/
├── uefi_boot.c # UEFI entry point (efi_main)
├── uefi_console.c # GOP framebuffer + serial console
├── uefi_memory.c # UEFI memory map acquisition
├── uefi_time.c # UEFI time services backend
└── uefi_exit.c # ExitBootServices transition
UEFI Boot Flow:
efi_main(ImageHandle, SystemTable)
├─ Initialize UEFI console (GOP + serial)
├─ Get memory map (EFI_MEMORY_DESCRIPTOR array)
├─ Get framebuffer info (Graphics Output Protocol)
├─ Locate ACPI tables (for APIC/HPET)
├─ Call ExitBootServices()
└─ Jump to kernel_main()
Files to Create:
src/platform/uefi/uefi_boot.c- UEFI entry pointinclude/uefi_platform.h- UEFI platform abstractionssrc/platform/uefi/uefi_memory.c- Memory map handlingsrc/platform/uefi/uefi_console.c- Early console (GOP + COM1)
Files to Modify:
src/main.c- Add conditional compilation:#ifdef UEFI_BUILD EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable); #else int main(int argc, char* argv[]); #endif
1.2 Build System for UEFI
New Makefile targets:
TARGET_UEFI = uefi
UEFI_OUTPUT = StarForth.efi
# UEFI-specific flags
UEFI_CFLAGS = -ffreestanding -fno-stack-protector -fno-builtin \
-mno-red-zone -DUEFI_BUILD=1 -DKERNEL_BUILD=1
# Use gnu-efi headers
UEFI_INCLUDES = -I/usr/include/efi -I/usr/include/efi/x86_64
# Link as UEFI PE/COFF
UEFI_LDFLAGS = -nostdlib -Wl,-dll -shared -Wl,--subsystem,10 -e efi_main
uefi: $(UEFI_OUTPUT)
New linker script: build/uefi.ld (PE/COFF format for UEFI)
Files to Create:
build/uefi.ld- UEFI linker script- Update
Makefilewith UEFI targets
Milestone: StarForth.efi boots in QEMU with OVMF, prints "Hello from StarForth kernel" via serial
Phase 2: Kernel Core Services (C Implementation)
Goal: Implement essential kernel primitives (memory, interrupts, scheduling) in C.
Duration: 4 weeks
2.1 Physical Memory Allocator
New files:
src/kernel/pmm.c- Physical memory manager (bitmap allocator)include/kernel/pmm.h
Design:
- Bitmap allocator (1 bit per 4KB page)
- Bootstrap from UEFI memory map
- 4KB page granularity
typedef struct {
uint64_t* bitmap; // 1 bit per 4KB page
uint64_t total_pages;
uint64_t free_pages;
} PhysicalMemoryManager;
uint64_t pmm_alloc_page(void); // Returns physical address
void pmm_free_page(uint64_t phys_addr);
void pmm_init(EFI_MemRegion* regions, size_t count);
2.2 Virtual Memory (Paging)
New files:
src/kernel/vmm.c- Virtual memory managerinclude/kernel/vmm.h
x86_64 paging: 4-level page tables (PML4 → PDPT → PD → PT)
Kernel memory layout:
Virtual Address Space (x86_64):
0xFFFFFFFF80000000 - 0xFFFFFFFF80200000 Kernel code/data (2MB)
0xFFFFFFFF80200000 - 0xFFFFFFFF90000000 Kernel heap (256MB)
0xFFFFFFFF90000000 - 0xFFFFFFFF95000000 StarForth VM memory (5MB per VM)
0xFFFFFFFF95000000 - 0xFFFFFFFFA0000000 Physics subsystems
0xFFFFFFFFA0000000 - 0xFFFFFFFFFFFFFFFF MMIO mappings
Functions:
void vmm_init(void);
void* vmm_map_page(uint64_t phys, uint64_t virt, uint32_t flags);
void vmm_unmap_page(uint64_t virt);
void page_fault_handler(void); // IDT #14
Preserves vaddr_t abstraction: Already 64-bit in include/vm.h:95
2.3 Interrupt Descriptor Table (IDT)
New files:
src/kernel/idt.c- IDT setupsrc/kernel/isr.S- Interrupt stubs (x86_64 assembly)include/kernel/interrupts.h
IDT structure (256 entries):
- 0-31: CPU exceptions (divide-by-zero, page fault, etc.)
- 32-47: IRQs (timer, keyboard, etc.)
- 48-255: Software interrupts
Critical handlers:
- IRQ 0 (Timer): Scheduler tick, heartbeat coordination
- IRQ 1 (Keyboard): Input handling
- Exception #14 (Page Fault): Demand paging
Heartbeat integration: Timer IRQ triggers vm_tick() in background (replaces pthread)
2.4 GDT/TSS Setup
New files:
src/kernel/gdt.cinclude/kernel/gdt.h
GDT layout:
0: Null descriptor
1: Kernel code (ring 0, 64-bit)
2: Kernel data (ring 0)
3: User code (ring 3, 64-bit)
4: User data (ring 3)
5: TSS descriptor
TSS: Required for privilege level switches, interrupt stacks
2.5 Timer (APIC/HPET)
New files:
src/kernel/timer.cinclude/kernel/timer.h
Timer options (priority order):
- Local APIC timer (per-CPU)
- HPET (High Precision Event Timer)
- PIT (8254 legacy fallback)
Integration: Implements sf_time_backend_t from include/platform_time.h
2.6 Basic Scheduler
New files:
src/kernel/sched.cinclude/kernel/sched.h
Task structure:
typedef struct Task {
uint64_t pid;
uint64_t rsp; // Stack pointer
uint64_t rip; // Instruction pointer
uint64_t cr3; // Page table base
uint32_t state; // RUNNING, READY, BLOCKED
VM* vm_ctx; // StarForth VM context (FORTH task)
struct Task* next;
} Task;
Algorithm: Round-robin, 1ms quantum
FORTH VM as kernel task: Initial boot creates single FORTH VM task (PID 1)
Milestone: Kernel manages memory, handles timer IRQs, schedules tasks
Phase 3: Kernel Services as FORTH Words
Goal: Implement kernel services as FORTH words. The VM already runs in ring 0 - now make it a full microkernel.
Duration: 4 weeks
3.1 Kernel Memory Allocator
New files:
src/kernel/kmalloc.c- Kernel heap allocatorinclude/kernel/kmalloc.h
Design: Simple bump allocator or slab allocator backed by pmm_alloc_page()
Replace malloc everywhere:
#ifdef KERNEL_BUILD
#define malloc(n) kmalloc(n)
#define free(p) kfree(p)
#endif
Files to modify (all files with malloc/free calls):
src/vm.c:176- VM memory allocationsrc/vm.c:255-336- Physics subsystems- All word modules that use malloc
3.2 Memory Model Transformation
Current issue: vm->memory = malloc(VM_MEMORY_SIZE) in src/vm.c:176
Solution:
#ifdef KERNEL_BUILD
vm->memory = (uint8_t*)kmalloc(VM_MEMORY_SIZE);
#else
vm->memory = (uint8_t*)malloc(VM_MEMORY_SIZE);
#endif
Dictionary headers: Keep outside VM memory initially (kmalloc'd), optimize later
Stacks: Keep as C arrays in VM struct (simplest approach)
3.3 Kernel Services as FORTH Words
New word module:
src/word_source/kernel_words.c
Exposed primitives:
PMEM-ALLOC ( n -- addr ) \ Allocate n pages of physical memory
PMEM-FREE ( addr -- ) \ Free physical page
VMAP ( phys virt flags -- )\ Map virtual → physical
VUNMAP ( virt -- ) \ Unmap virtual page
IRQ-ENABLE ( n -- ) \ Enable IRQ n
IRQ-DISABLE ( n -- ) \ Disable IRQ n
TASK-CREATE ( xt stack -- pid ) \ Create new FORTH task
TASK-YIELD ( -- ) \ Yield CPU
TASK-KILL ( pid -- ) \ Terminate task
IOPERM ( port len -- ) \ Grant I/O port access
Implementation pattern:
static void word_PMEM_ALLOC(VM* vm) {
cell_t npages = vm_pop(vm);
uint64_t phys = pmm_alloc_pages(npages);
vm_push(vm, CELL(phys));
}
void register_kernel_words(VM* vm) {
register_word(vm, "PMEM-ALLOC", word_PMEM_ALLOC);
register_word(vm, "VMAP", word_VMAP);
// ... etc
}
Files to modify:
src/word_registry.c:98- Addregister_kernel_words(vm);
3.4 Physics Runtime Preservation
Critical subsystems to preserve:
- Execution heat tracking
- Rolling window of truth
- Hot-words cache
- Pipelining metrics
- Heartbeat system
- SSM L8 Jacquard mode selector
Kernel integration:
- Heartbeat via timer IRQ: Replace pthread (
src/vm.c:40-44) with timer IRQ →vm_tick() - Memory allocation: Physics subsystems use kmalloc (no functional changes)
- Mutexes: Use atomic spinlocks (already implemented for L4Re)
No changes needed: All 7 feedback loops work as-is
Milestone: FORTH REPL runs in kernel mode, can allocate memory via FORTH words, all 936+ tests pass
Phase 4: Platform Completion (I/O Services)
Goal: Kernel has functional console, block I/O, time services.
Duration: 2 weeks
4.1 Kernel Console (Framebuffer + Serial)
New files:
src/platform/kernel/kernel_console.cinclude/kernel/console.h
Pre-ExitBootServices: UEFI Simple Text Output Protocol
Post-ExitBootServices:
- GOP framebuffer (graphical text console)
- Serial port (COM1, 0x3F8)
Framebuffer rendering:
- Store GOP framebuffer info before ExitBootServices
- Simple text renderer (PSF font or bitmap font)
- Scroll buffer
Files to modify:
src/io.c- Add#ifdef KERNEL_BUILDconditional forsf_putchar()
4.2 Block I/O Backend
Target both QEMU and real hardware:
Priority 1: RAM disk (already exists in src/blkio_ram.c)
- No changes needed
- Usable immediately
Priority 2: Virtio-blk (QEMU, cloud VMs)
src/platform/kernel/blkio_virtio.c- Implement
blkio_vtable_tfor virtio-blk
Priority 3: AHCI (SATA drives, real hardware)
src/platform/kernel/blkio_ahci.c- AHCI controller driver
Priority 4: NVMe (modern SSDs)
src/platform/kernel/blkio_nvme.c- NVMe driver
Integration: src/main.c:179 initializes blkio → call from kernel_main() after device enumeration
4.3 Time Services
New files:
src/platform/kernel/kernel_time.c
Implementation: APIC timer or HPET backend implementing sf_time_backend_t
Files to modify:
src/platform/platform_init.c:47- Add kernel backend selection
Milestone: Kernel has functional I/O (console, blocks, timers), can save/load FORTH blocks
Phase 5: Multi-Architecture Support
Goal: Extend kernel to ARM64 and RISC-V64.
Duration: 4 weeks
5.1 Architecture Abstraction
New directory structure:
src/kernel/arch/
├── x86_64/
│ ├── boot.S # Early boot assembly
│ ├── gdt.c # GDT/TSS setup
│ ├── idt.c # IDT/interrupts
│ ├── paging.c # Page table management
│ └── switch.S # Context switching
├── arm64/
│ ├── boot.S # Early boot assembly
│ ├── mmu.c # ARM64 MMU setup
│ ├── gic.c # GIC (Generic Interrupt Controller)
│ ├── timer.c # ARM Generic Timer
│ └── switch.S # Context switching
└── riscv64/
├── boot.S # Early boot assembly
├── mmu.c # RISC-V SV39 paging
├── plic.c # PLIC (interrupt controller)
├── timer.c # RISC-V timer
└── switch.S # Context switching
5.2 x86_64 Kernel Flow
efi_main() → ExitBootServices() → kernel_main()
├─ gdt_init() # Setup GDT/TSS
├─ idt_init() # Setup IDT
├─ pmm_init() # Physical memory
├─ vmm_init() # Virtual memory
├─ timer_init() # APIC timer
├─ sched_init() # Scheduler
├─ vm_init() # StarForth VM
├─ register_forth79_words()
├─ register_kernel_words()
└─ vm_repl() # Enter FORTH REPL
5.3 ARM64 Differences
UEFI: ARM64 UEFI spec (AARCH64)
Architecture-specific:
- MMU: 4-level page tables (similar to x86_64)
- Interrupts: GIC (Generic Interrupt Controller) vs. APIC
- Timer: ARM Generic Timer vs. APIC timer
- No GDT/TSS (ARM64 uses system registers)
New files:
src/kernel/arch/arm64/gic.c- GIC setupsrc/kernel/arch/arm64/timer.c- ARM timer- Assembly already exists:
include/vm_asm_opt_arm64.h(~1200 lines, unprivileged)
5.4 RISC-V64 Considerations
Boot: UEFI (limited hardware) or OpenSBI (Supervisor Binary Interface)
Architecture-specific:
- MMU: SV39 (3-level page tables)
- Interrupts: PLIC (Platform-Level Interrupt Controller)
- Timer: RISC-V machine timer (mtime/mtimecmp)
- Privileged modes: M-mode (machine), S-mode (supervisor), U-mode (user)
New files:
src/kernel/arch/riscv64/plic.csrc/kernel/arch/riscv64/sbi.c- OpenSBI interface
Milestone: Kernel boots on x86_64, ARM64, RISC-V64; all tests pass on all architectures
Phase 6: Advanced Kernel Features
Goal: Production-ready kernel capabilities.
Duration: 8 weeks
6.1 FORTH Process Model
Each FORTH process:
- Own VM instance
- Separate dictionary, stacks, memory
- Copy-on-write for shared code
Process creation:
: NEW-TASK ( xt -- pid )
TASK-CREATE \ Create task structure
VM-CLONE \ Clone current VM
TASK-START \ Begin execution
;
6.2 IPC (Inter-Process Communication)
New word module: src/word_source/ipc_words.c
FORTH-native IPC:
CHAN-CREATE ( size -- chan ) \ Create message channel
CHAN-SEND ( chan msg len -- ) \ Send message
CHAN-RECV ( chan buf max -- n ) \ Receive (blocking)
CHAN-CLOSE ( chan -- ) \ Close channel
Implementation: Message passing via kernel buffers
6.3 Device Drivers
Real hardware drivers (for real hardware deployment):
Priority order:
- Serial (UART): Already needed for console
- Disk (AHCI/NVMe): For real storage
- Network (E1000/virtio-net): For networking (Phase 6)
- USB: For keyboards, storage, etc.
- Graphics (simple framebuffer): Already have from UEFI GOP
Driver model: C drivers + FORTH extensibility
Example: Expose driver APIs as FORTH words
\ FORTH-based LED driver
: LED-ON 0x60 1 IO-OUT ; \ Write to GPIO
: LED-OFF 0x60 0 IO-OUT ;
6.4 Networking Stack (Phase 6)
Stack: lwIP (lightweight IP stack)
- Minimal, embedded-friendly
- TCP/IP, UDP, ICMP
- Integrate as kernel module
Drivers:
- virtio-net (QEMU)
- E1000 (Intel Ethernet, common in VMs)
FORTH integration:
NET-SOCKET ( domain type -- fd )
NET-BIND ( fd addr port -- )
NET-LISTEN ( fd backlog -- )
NET-ACCEPT ( fd -- newfd )
NET-SEND ( fd buf len -- n )
NET-RECV ( fd buf max -- n )
6.5 File System
Phase 1: Block-based (current)
- Already implemented:
src/block_subsystem.c - 1KB blocks, simple addressing
Phase 2: VFS + ext2
- Virtual File System layer
- ext2 (simple, well-documented)
- Mount from virtio-blk or AHCI
FORTH integration:
FS-MOUNT ( device path -- )
FS-OPEN ( path flags -- fd )
FS-READ ( fd buf len -- n )
FS-WRITE ( fd buf len -- n )
FS-CLOSE ( fd -- )
6.6 Userspace Model
Pure FORTH environment (no ELF loader):
- All processes are FORTH VMs
- Native FORTH execution
- System services via FORTH words
Init process: StarForth REPL (PID 1)
- Interactive kernel exploration
- Spawn tasks from FORTH
- All administration via FORTH
Milestone: Production-ready hybrid kernel with multi-process FORTH, IPC, networking, filesystems
Build System Architecture
Makefile Targets
# Standard builds (unchanged)
make # Optimized build for Linux
make fastest # Maximum performance
make test # Run test suite
# UEFI kernel builds (new)
make kernel-x86_64 # x86_64 UEFI kernel
make kernel-arm64 # ARM64 UEFI kernel
make kernel-riscv64 # RISC-V64 UEFI kernel
# Testing
make kernel-test # Run tests in kernel mode (QEMU)
Compiler Flags
# Kernel build flags
KERNEL_CFLAGS = -ffreestanding -fno-stack-protector -fno-builtin \
-mno-red-zone -DKERNEL_BUILD=1 -DUEFI_BUILD=1 \
-Wall -Werror
# Architecture-specific flags
KERNEL_CFLAGS_X86_64 = -march=x86-64 -mcmodel=kernel
KERNEL_CFLAGS_ARM64 = -march=armv8-a -mcmodel=large
KERNEL_CFLAGS_RISCV64 = -march=rv64gc -mcmodel=medany
Linker Scripts
File: build/kernel.ld
ENTRY(efi_main)
SECTIONS {
. = 0xFFFFFFFF80100000; /* Kernel base */
.text : { *(.text .text.*) }
.rodata : { *(.rodata .rodata.*) }
.data : { *(.data .data.*) }
.bss : { *(.bss .bss.*) *(COMMON) }
}
Conditional Compilation
All source files use:
#ifdef KERNEL_BUILD
// Kernel-specific code
#include "kernel/kmalloc.h"
void* ptr = kmalloc(size);
#else
// Userspace code
#include <stdlib.h>
void* ptr = malloc(size);
#endif
Testing Strategy
Phase 1: UEFI Boot
- Environment: QEMU with OVMF UEFI firmware
- Test: Boot StarForth.efi, print via serial
- Verify: Memory map parsed, framebuffer acquired
- Command:
qemu-system-x86_64 -bios /usr/share/ovmf/OVMF.fd -hda fat:rw:esp
Phase 2: Kernel Primitives
- Test: Timer IRQ fires, PMM allocates pages
- Verify: Timer interrupt handler increments tick count
- Debug: QEMU GDB remote debugging (
-s -S)
Phase 3: FORTH Integration
- Test: Run existing test suite in kernel mode
- Verify: All 936+ tests pass
- Tools: FORTH test runner (
src/test_runner/)
Phase 4: Platform Completion
- Test: Block I/O read/write, console rendering
- Verify: Save/load FORTH blocks, framebuffer text
- Tools: virtio-blk disk image
Phase 5: Multi-Architecture
- Test: Boot on QEMU ARM64 (
qemu-system-aarch64 -machine virt) - Test: Boot on QEMU RISC-V64 (
qemu-system-riscv64 -machine virt) - Verify: Same test suite passes on all architectures
Phase 6: Integration Testing
- Test: Multi-process FORTH, IPC, networking
- Verify: Processes communicate, TCP/IP stack works
- Tools: Network testing tools, stress tests
Critical Files Summary
New Directories
src/kernel/ # Kernel core services
src/kernel/arch/ # Architecture-specific code
src/platform/uefi/ # UEFI platform layer
src/platform/kernel/ # Kernel platform backends
Files to Create (Phase 1-3)
src/platform/uefi/uefi_boot.c
src/platform/uefi/uefi_console.c
src/platform/uefi/uefi_memory.c
src/kernel/pmm.c
src/kernel/vmm.c
src/kernel/idt.c
src/kernel/gdt.c
src/kernel/timer.c
src/kernel/sched.c
src/kernel/kmalloc.c
src/word_source/kernel_words.c
build/uefi.ld
Files to Modify (Key Changes)
src/main.c # Add efi_main() entry point
src/vm.c # Replace malloc with kmalloc
src/word_registry.c # Register kernel_words module
src/io.c # Conditional kernel console
Makefile # Add UEFI build targets
Design Decisions & Rationale
1. StarForth IS the Kernel
Decision: No separate kernel layer - StarForth.efi runs in ring 0 as the microkernel Rationale: Captain Bob's architecture - the VM interpreter itself is the microkernel. FORTH words are kernel primitives.
2. Pure FORTH Environment (No ELF)
Decision: No ELF loader, no POSIX compatibility Rationale: Captain Bob specified pure FORTH. Simplifies kernel, stays true to FORTH philosophy.
3. Kernel Memory Layout
Decision: VM memory at fixed kernel virtual address (0xFFFFFFFF90000000) Rationale: Preserves existing 5MB contiguous memory model, clean separation from kernel heap.
4. System Call Interface
Decision: FORTH words ARE the system call interface Rationale: VM runs in ring 0, FORTH words directly manipulate kernel state. No syscall instruction needed - just execute FORTH words.
5. Driver Model
Decision: C drivers + FORTH extensibility
Rationale: Performance-critical drivers in C (virtio, AHCI), simple devices can use FORTH via IO-IN/IO-OUT words.
6. Dictionary Allocation
Decision: Keep dictionary headers outside VM memory (kmalloc'd) Rationale: Simpler initial implementation, can optimize later.
7. Heartbeat Integration
Decision: Timer IRQ triggers VM heartbeat (replaces pthread) Rationale: Natural fit - timer already exists for scheduler, preserves all 7 feedback loops.
Risks & Mitigation
Risk 1: UEFI Complexity
Challenge: UEFI spec is large, error-prone Mitigation: Use gnu-efi library, reference TianoCore EDK2
Risk 2: Memory Management Bugs
Challenge: Virtual memory, paging, page faults are error-prone Mitigation: Start with identity mapping, incremental complexity, extensive testing
Risk 3: Interrupt Handling
Challenge: IDT/GDT setup, interrupt routing, race conditions Mitigation: Reference existing kernels (Linux, xv6), careful locking
Risk 4: Physics Runtime Preservation
Challenge: Adaptive runtime depends on timing, allocations Mitigation: Preserve existing heartbeat logic, use kernel timer IRQ
Risk 5: Multi-Architecture Porting
Challenge: ARM64/RISC-V64 have different boot, MMU, interrupt models Mitigation: Abstract architecture-specific code early, test on QEMU
Risk 6: Real Hardware Debugging
Challenge: No printf, debugger in early boot Mitigation: Serial console (COM1), QEMU GDB stub for development
Timeline Summary
| Phase | Duration | Milestone |
|---|---|---|
| Phase 1: UEFI Boot | 2 weeks | StarForth.efi boots, prints via serial |
| Phase 2: Kernel Primitives | 4 weeks | Memory management, interrupts, scheduler working |
| Phase 3: FORTH Integration | 4 weeks | FORTH REPL in kernel mode, tests pass |
| Phase 4: Platform Completion | 2 weeks | Console, block I/O, timers functional |
| Phase 5: Multi-Architecture | 4 weeks | Boots on x86_64, ARM64, RISC-V64 |
| Phase 6: Advanced Features | 8 weeks | Multi-process, IPC, networking, filesystems |
| Total | 24 weeks | Production-ready hybrid kernel |
Success Criteria
Phase 1 Success: StarForth.efi boots in QEMU, displays UEFI console output, acquires memory map
Phase 2 Success: Kernel handles timer interrupts, allocates/frees memory, schedules dummy tasks
Phase 3 Success: FORTH REPL runs in kernel mode, all 936+ tests pass, kernel words work
Phase 4 Success: Can type in framebuffer console, save/load FORTH blocks to disk
Phase 5 Success: Same kernel boots on x86_64 QEMU, ARM64 QEMU, RISC-V64 QEMU
Phase 6 Success: Multiple FORTH processes communicate via IPC, TCP/IP stack sends packets
Final Success: StarshipOS boots on real hardware (x86_64 PC or Raspberry Pi), runs FORTH REPL, manages processes, saves blocks to disk, connects to network
Next Steps
-
Setup development environment:
- Install QEMU, OVMF UEFI firmware
- Install gnu-efi or EDK2
- Setup serial console logging
-
Create basic directory structure:
src/platform/uefi/src/kernel/include/kernel/
-
Implement Phase 1:
- UEFI entry point (
efi_main) - Memory map acquisition
- Early console (serial)
- ExitBootServices
- UEFI entry point (
-
Iterate through phases:
- Complete each phase fully before moving to next
- Test thoroughly at each milestone
- Maintain compatibility with existing Linux builds
This is an ambitious, technically challenging project that will result in a truly unique operating system: A FORTH-based hybrid kernel with physics-driven adaptive runtime, running bare-metal on multiple architectures.