# 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 1. `main()` → platform init → block I/O → VM initialization (5MB memory, stacks, mutexes) 2. FORTH-79 word registration (23 modules, ~600 words) 3. Physics subsystems: hot-words cache, rolling window, heartbeat, pipelining, SSM L8 4. System bootstrap: `vm_interpret("INIT")` loads init.4th 5. Test suite (936+ tests) → REPL ### Memory Model - `vaddr_t` abstraction: 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 point - `include/uefi_platform.h` - UEFI platform abstractions - `src/platform/uefi/uefi_memory.c` - Memory map handling - `src/platform/uefi/uefi_console.c` - Early console (GOP + COM1) **Files to Modify:** - `src/main.c` - Add conditional compilation: ```c #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:** ```make 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 `Makefile` with 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 ```c 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 manager - `include/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:** ```c 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 setup - `src/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.c` - `include/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.c` - `include/kernel/timer.h` **Timer options** (priority order): 1. Local APIC timer (per-CPU) 2. HPET (High Precision Event Timer) 3. PIT (8254 legacy fallback) **Integration**: Implements `sf_time_backend_t` from `include/platform_time.h` ### 2.6 Basic Scheduler **New files:** - `src/kernel/sched.c` - `include/kernel/sched.h` **Task structure:** ```c 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 allocator - `include/kernel/kmalloc.h` **Design**: Simple bump allocator or slab allocator backed by `pmm_alloc_page()` **Replace malloc everywhere:** ```c #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 allocation - `src/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**: ```c #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:** ```forth 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:** ```c 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` - Add `register_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:** 1. **Heartbeat via timer IRQ**: Replace pthread (`src/vm.c:40-44`) with timer IRQ → `vm_tick()` 2. **Memory allocation**: Physics subsystems use kmalloc (no functional changes) 3. **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.c` - `include/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_BUILD` conditional for `sf_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_t` for 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 setup - `src/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.c` - `src/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**: ```forth : 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**: ```forth 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**: 1. **Serial (UART)**: Already needed for console 2. **Disk (AHCI/NVMe)**: For real storage 3. **Network (E1000/virtio-net)**: For networking (Phase 6) 4. **USB**: For keyboards, storage, etc. 5. **Graphics (simple framebuffer)**: Already have from UEFI GOP **Driver model**: C drivers + FORTH extensibility **Example**: Expose driver APIs as FORTH words ```forth \ 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**: ```forth 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**: ```forth 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 ```make # 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 ```make # 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` ```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**: ```c #ifdef KERNEL_BUILD // Kernel-specific code #include "kernel/kmalloc.h" void* ptr = kmalloc(size); #else // Userspace code #include 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 1. **Setup development environment**: - Install QEMU, OVMF UEFI firmware - Install gnu-efi or EDK2 - Setup serial console logging 2. **Create basic directory structure**: - `src/platform/uefi/` - `src/kernel/` - `include/kernel/` 3. **Implement Phase 1**: - UEFI entry point (`efi_main`) - Memory map acquisition - Early console (serial) - ExitBootServices 4. **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.