From 694a753bedbc65703145b3fccbe3ac0b802461be Mon Sep 17 00:00:00 2001 From: Markus Maiwald Date: Tue, 30 Dec 2025 07:21:27 +0100 Subject: [PATCH] feat: Initialize Rumpk Modular Unikernel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit STRATEGIC PIVOT: From Project to Doctrine ========================================== This commit initializes Rumpk - a ground-zero Zig+Nim unikernel with POSIX-hostile design, hard ABI barriers, and military-grade security. DOCUMENTATION (3 New Specs) --------------------------- • SPEC-008-RUMPK-ARCHITECTURE.md - L0 (Zig): Boot, PMM, IRQ, HAL - L1 (Nim): LWKT Scheduler, Fibers, Disruptor Ring - L2 (ABI): struct HAL function pointers (future Janus socket) - L3 (Payload): NPL/NPK loaders, optional POSIX shim - SipHash IDs + Ed25519 signed execution • SPEC-009-RUMPK-IO.md - Disruptor Ring: Lock-free O(1) inter-fiber communication - Adaptive Governor: War Mode (polling) ↔ Peace Mode (interrupts) - Zero VM-exit design (Rumkv does NOT touch packets) • SPEC-010-SOVEREIGN-HIERARCHY-V2.md - /Cas: Immutable Content-Addressable Storage - /Cell: Active Containers (Driver/, App/, Sensor/) - /Bus: Active Interfaces (replaces /dev) - /Data: Mutable Persistence (User/, Volume/) - 'The Unix Lie' compatibility layer for legacy apps VISION.MD UPDATE ---------------- • Added dedicated Rumpk section differentiating from Rumk • Documented 4-layer architecture with ASCII diagram • Listed key innovations: Adaptive I/O, Disruptor, SipHash, Ed25519 REPOSITORY STRUCTURE (core/rumpk/) ---------------------------------- core/rumpk/ ├── boot/header.zig # Multiboot2/EFI entry ├── hal/abi.zig # L0→L1 ABI contract (struct HAL) ├── core/kernel.nim # kmain() entry point ├── core/ring.nim # Disruptor ring buffer ├── io/governor.nim # Adaptive War/Peace I/O ├── build.zig # Zig build orchestration └── README.md # Feature index DESIGN DECISIONS ---------------- • Hard ABI barrier: Zig exports C-compatible struct to Nim • Language-agnostic: L1 can be swapped for Janus later • No shared state: Fibers communicate via Channels only • No JIT, No W^X violations: Code sections immutable NEXT STEPS ---------- • Phase 1: Boot on QEMU (print 'Hello Rumpk') • Phase 2: Nim runtime on bare metal • Phase 3: Two fibers switching (Ping/Pong) • Phase 4: NPL loading with signature verification • Phase 5: VisionFive 2 hardware validation This is the foundation for the 'OS Factory' vision. Rumpk + Rumkv + NPL = Independent from Unix/Linux. Tested: Directory structure validated Status: ✅ SCAFFOLD COMPLETE --- .../h/5185954eff7f7c6c82121d2fd2e2d4fd.txt | 0 .zig-cache/h/timestamp | 0 .../dependencies.zig | 2 + .zig-cache/z/0de2bc7b8ecf843738d5e3b13139ce2e | Bin 0 -> 429 bytes .zig-cache/z/4cdd191b80afdf78c75a2dbd44f113ff | Bin 0 -> 170195 bytes .zig-cache/z/6f1a1195a5c1b6e16f67c3dd3fe19ab5 | Bin 0 -> 14881 bytes .zig-cache/z/a36ff463ebe2b895b642ea13063bf31d | Bin 0 -> 90 bytes README.md | 53 +++++++++++++++ boot/header.zig | 62 +++++++++++++++++ build.zig | 54 +++++++++++++++ core/kernel.nim | 41 ++++++++++++ core/ring.nim | 58 ++++++++++++++++ hal/abi.zig | 63 ++++++++++++++++++ io/governor.nim | 61 +++++++++++++++++ 14 files changed, 394 insertions(+) create mode 100644 .zig-cache/h/5185954eff7f7c6c82121d2fd2e2d4fd.txt create mode 100644 .zig-cache/h/timestamp create mode 100644 .zig-cache/o/f1ea4330472a4c6ebcbfed6922919020/dependencies.zig create mode 100644 .zig-cache/z/0de2bc7b8ecf843738d5e3b13139ce2e create mode 100644 .zig-cache/z/4cdd191b80afdf78c75a2dbd44f113ff create mode 100644 .zig-cache/z/6f1a1195a5c1b6e16f67c3dd3fe19ab5 create mode 100644 .zig-cache/z/a36ff463ebe2b895b642ea13063bf31d create mode 100644 README.md create mode 100644 boot/header.zig create mode 100644 build.zig create mode 100644 core/kernel.nim create mode 100644 core/ring.nim create mode 100644 hal/abi.zig create mode 100644 io/governor.nim diff --git a/.zig-cache/h/5185954eff7f7c6c82121d2fd2e2d4fd.txt b/.zig-cache/h/5185954eff7f7c6c82121d2fd2e2d4fd.txt new file mode 100644 index 0000000..e69de29 diff --git a/.zig-cache/h/timestamp b/.zig-cache/h/timestamp new file mode 100644 index 0000000..e69de29 diff --git a/.zig-cache/o/f1ea4330472a4c6ebcbfed6922919020/dependencies.zig b/.zig-cache/o/f1ea4330472a4c6ebcbfed6922919020/dependencies.zig new file mode 100644 index 0000000..72e4e83 --- /dev/null +++ b/.zig-cache/o/f1ea4330472a4c6ebcbfed6922919020/dependencies.zig @@ -0,0 +1,2 @@ +pub const packages = struct {}; +pub const root_deps: []const struct { []const u8, []const u8 } = &.{}; diff --git a/.zig-cache/z/0de2bc7b8ecf843738d5e3b13139ce2e b/.zig-cache/z/0de2bc7b8ecf843738d5e3b13139ce2e new file mode 100644 index 0000000000000000000000000000000000000000..ccfe6c24bd7ffe6b8da6057837ba706a55588f50 GIT binary patch literal 429 zcmd;OU|o?U<0DgopE*7l&RK&%YJAPYc}Vo(}n8VgWB7Rqk{((*tIQr7^)AoD+(w3%*hv literal 0 HcmV?d00001 diff --git a/.zig-cache/z/4cdd191b80afdf78c75a2dbd44f113ff b/.zig-cache/z/4cdd191b80afdf78c75a2dbd44f113ff new file mode 100644 index 0000000000000000000000000000000000000000..4b43278eca6a02a7747df5d62c569adefbee5e1a GIT binary patch literal 170195 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

W2nF_eHx_8=;p`kH*1199uKcH0XUvw*cFsPa&>( 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 literal 0 HcmV?d00001 diff --git a/.zig-cache/z/6f1a1195a5c1b6e16f67c3dd3fe19ab5 b/.zig-cache/z/6f1a1195a5c1b6e16f67c3dd3fe19ab5 new file mode 100644 index 0000000000000000000000000000000000000000..561e3a37b87b7ba15170969594932d9113b53252 GIT binary patch literal 14881 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 literal 0 HcmV?d00001 diff --git a/.zig-cache/z/a36ff463ebe2b895b642ea13063bf31d b/.zig-cache/z/a36ff463ebe2b895b642ea13063bf31d new file mode 100644 index 0000000000000000000000000000000000000000..fc377a7db7c603cc8f52423b538ebf3f3d873689 GIT binary patch literal 90 zcmZQ%U|?VbVh$h%fh_?OAPgv}Sl)2+`pZ@cnBZ?F7z;-0Gkf&iFZkg3P->>QRO*ps GFmV9 **"The Kernel is a Library. The App is the OS."** + +**Status:** EXPERIMENTAL +**Languages:** Zig (L0) + Nim (L1) +**Design:** POSIX-hostile, Military-grade + +## Directory Structure + +``` +rumpk/ +├── boot/ [L0] Entry & Architecture (Zig/Asm) +│ ├── start.S Multiboot2/EFI entry point +│ └── arch/ Architecture-specific code +├── hal/ [L0] Hardware Abstraction (Zig) +│ ├── mm.zig Physical/Virtual Memory +│ ├── irq.zig Interrupt handling +│ ├── serial.zig UART/Early logging +│ └── abi.zig C-ABI export to Nim +├── core/ [L1] Logic (Nim) +│ ├── kernel.nim kmain() entry +│ ├── sched.nim LWKT Scheduler +│ ├── fiber.nim Fiber/Context management +│ └── ring.nim Disruptor buffer +├── sys/ [L2] ABI Glue +│ └── syscall.zig System call handlers +├── payload/ [L3] NPL/NPK Loaders +│ └── loader.nim Signature verification +└── io/ I/O Subsystem + └── governor.nim Adaptive War/Peace mode +``` + +## Key Features + +- **Adaptive I/O**: War Mode (polling) ↔ Peace Mode (interrupts) +- **Disruptor Ring**: Lock-free inter-fiber communication +- **SipHash IDs**: Collision-resistant process identification +- **Ed25519**: Only signed code executes + +## Specifications + +- [SPEC-008: Architecture](/.agents/specs/SPEC-008-RUMPK-ARCHITECTURE.md) +- [SPEC-009: I/O Subsystem](/.agents/specs/SPEC-009-RUMPK-IO.md) +- [SPEC-010: Sovereign Hierarchy](/.agents/specs/SPEC-010-SOVEREIGN-HIERARCHY-V2.md) + +## Build (Coming Soon) + +```bash +cd core/rumpk +zig build # Build L0 HAL +nimble build # Build L1 Logic +``` diff --git a/boot/header.zig b/boot/header.zig new file mode 100644 index 0000000..f837fdc --- /dev/null +++ b/boot/header.zig @@ -0,0 +1,62 @@ +// Rumpk Boot Header +// Multiboot2 / EFI entry point definition + +const std = @import("std"); + +// ========================================================= +// Multiboot2 Header (for GRUB/QEMU) +// ========================================================= + +const MULTIBOOT2_MAGIC: u32 = 0xe85250d6; +const MULTIBOOT2_ARCH_I386: u32 = 0; +const MULTIBOOT2_HEADER_LENGTH: u32 = @sizeOf(Multiboot2Header); + +const Multiboot2Header = extern struct { + magic: u32 = MULTIBOOT2_MAGIC, + architecture: u32 = MULTIBOOT2_ARCH_I386, + header_length: u32 = MULTIBOOT2_HEADER_LENGTH, + checksum: u32, + + // End tag + end_tag_type: u16 = 0, + end_tag_flags: u16 = 0, + end_tag_size: u32 = 8, +}; + +fn computeChecksum() u32 { + return @bitCast(-%@as(i32, @bitCast(MULTIBOOT2_MAGIC +% MULTIBOOT2_ARCH_I386 +% MULTIBOOT2_HEADER_LENGTH))); +} + +export const multiboot2_header linksection(".multiboot2") = Multiboot2Header{ + .checksum = computeChecksum(), +}; + +// ========================================================= +// Entry Point +// ========================================================= + +extern fn kmain() noreturn; + +export fn _start() callconv(.Naked) noreturn { + // Clear BSS, set up stack, then jump to Nim + asm volatile ( + \\ // Set up stack + \\ la sp, __stack_top + \\ + \\ // Clear BSS + \\ la t0, __bss_start + \\ la t1, __bss_end + \\1: + \\ bge t0, t1, 2f + \\ sd zero, (t0) + \\ addi t0, t0, 8 + \\ j 1b + \\2: + \\ // Jump to Nim kmain + \\ call kmain + \\ + \\ // Should never return + \\ wfi + \\ j 2b + ); +} diff --git a/build.zig b/build.zig new file mode 100644 index 0000000..70f8911 --- /dev/null +++ b/build.zig @@ -0,0 +1,54 @@ +// Rumpk Build System +// Orchestrates L0 (Zig) and L1 (Nim) compilation + +const std = @import("std"); + +pub fn build(b: *std.Build) void { + const target = b.standardTargetOptions(.{}); + const optimize = b.standardOptimizeOption(.{}); + + // ========================================================= + // L0: Hardware Abstraction Layer (Zig) + // ========================================================= + + const hal = b.addStaticLibrary(.{ + .name = "rumpk_hal", + .root_source_file = b.path("hal/abi.zig"), + .target = target, + .optimize = optimize, + }); + + // Freestanding kernel - no libc + hal.root_module.red_zone = false; + hal.root_module.stack_check = .none; + + b.installArtifact(hal); + + // ========================================================= + // Boot: Entry Point (Assembly + Zig) + // ========================================================= + + const boot = b.addObject(.{ + .name = "boot", + .root_source_file = b.path("boot/header.zig"), + .target = target, + .optimize = optimize, + }); + + boot.root_module.red_zone = false; + boot.root_module.stack_check = .none; + + // ========================================================= + // Tests + // ========================================================= + + const hal_tests = b.addTest(.{ + .root_source_file = b.path("hal/abi.zig"), + .target = target, + .optimize = optimize, + }); + + const run_tests = b.addRunArtifact(hal_tests); + const test_step = b.step("test", "Run Rumpk HAL tests"); + test_step.dependOn(&run_tests.step); +} diff --git a/core/kernel.nim b/core/kernel.nim new file mode 100644 index 0000000..50bc84b --- /dev/null +++ b/core/kernel.nim @@ -0,0 +1,41 @@ +# Rumpk Kernel Core (Nim) +# kmain() entry point - called from L0 Zig boot + +{.push stackTrace: off.} + +# ========================================================= +# FFI Imports from L0 (Zig HAL) +# ========================================================= + +proc rumpk_console_write(p: pointer, len: csize_t) {.importc, cdecl.} +proc rumpk_halt() {.importc, cdecl, noreturn.} + +# ========================================================= +# Kernel I/O +# ========================================================= + +proc kprint(s: string) = + if s.len > 0: + rumpk_console_write(unsafeAddr s[0], csize_t(s.len)) + +proc kprintln(s: string) = + kprint(s) + kprint("\n") + +# ========================================================= +# Kernel Main +# ========================================================= + +proc kmain() {.exportc, cdecl, noreturn.} = + kprintln("╔═══════════════════════════════════════╗") + kprintln("║ RUMPK UNIKERNEL v0.0 ║") + kprintln("║ Zig+Nim • Zero POSIX • Modular ║") + kprintln("╚═══════════════════════════════════════╝") + kprintln("") + kprintln("[rumpk] L0 HAL initialized (Zig)") + kprintln("[rumpk] L1 Logic running (Nim)") + kprintln("[rumpk] Entering halt...") + + rumpk_halt() + +{.pop.} diff --git a/core/ring.nim b/core/ring.nim new file mode 100644 index 0000000..02c3b5e --- /dev/null +++ b/core/ring.nim @@ -0,0 +1,58 @@ +# Rumpk Disruptor Ring Buffer +# Lock-free O(1) inter-fiber communication + +import std/atomics + +type + Cursor* = object + value*: Atomic[int64] + + RingBuffer*[T; N: static[int]] = object + ## Lock-free circular buffer for zero-copy I/O + ## N must be power of 2 for masking + data*: array[N, T] + head*: Cursor ## Written by producer + tail*: Cursor ## Read by consumer + mask: int64 ## N - 1 for fast modulo + +proc init*[T; N: static[int]](ring: var RingBuffer[T, N]) = + ## Initialize the ring buffer + ring.head.value.store(0) + ring.tail.value.store(0) + ring.mask = N - 1 + +proc push*[T; N: static[int]](ring: var RingBuffer[T, N]; item: T): bool = + ## Push item to ring. Returns false if full. + let head = ring.head.value.load(moRelaxed) + let tail = ring.tail.value.load(moAcquire) + + if head - tail >= N: + return false # Full + + ring.data[head and ring.mask] = item + ring.head.value.store(head + 1, moRelease) + return true + +proc pop*[T; N: static[int]](ring: var RingBuffer[T, N]): tuple[ok: bool; item: T] = + ## Pop item from ring. Returns (false, default) if empty. + let tail = ring.tail.value.load(moRelaxed) + let head = ring.head.value.load(moAcquire) + + if tail >= head: + return (false, default(T)) # Empty + + let item = ring.data[tail and ring.mask] + ring.tail.value.store(tail + 1, moRelease) + return (true, item) + +proc len*[T; N: static[int]](ring: RingBuffer[T, N]): int = + ## Current number of items in ring + let head = ring.head.value.load(moRelaxed) + let tail = ring.tail.value.load(moRelaxed) + return int(head - tail) + +proc isFull*[T; N: static[int]](ring: RingBuffer[T, N]): bool = + ring.len >= N + +proc isEmpty*[T; N: static[int]](ring: RingBuffer[T, N]): bool = + ring.len == 0 diff --git a/hal/abi.zig b/hal/abi.zig new file mode 100644 index 0000000..9cd9ae7 --- /dev/null +++ b/hal/abi.zig @@ -0,0 +1,63 @@ +// HAL ABI - The Contract between L0 (Zig) and L1 (Nim) +// This struct is the "socket" for future language integration + +pub const HAL = extern struct { + /// Write to console/serial + console_write: *const fn ([*]const u8, usize) void, + + /// Allocate physical pages + palloc: *const fn (usize) ?*anyopaque, + + /// Free physical pages + pfree: *const fn (*anyopaque) void, + + /// Register interrupt handler + irq_register: *const fn (u8, *const fn () void) void, + + /// Get current time in nanoseconds + timer_now_ns: *const fn () u64, + + /// Halt the CPU + halt: *const fn () noreturn, +}; + +/// Global HAL instance - initialized by boot code +pub var hal: HAL = undefined; + +/// Initialize the HAL with platform-specific implementations +pub fn init(console: anytype, allocator: anytype) void { + hal = HAL{ + .console_write = console.write, + .palloc = allocator.alloc, + .pfree = allocator.free, + .irq_register = undefined, // TODO + .timer_now_ns = undefined, // TODO + .halt = halt_impl, + }; +} + +fn halt_impl() noreturn { + while (true) { + asm volatile ("wfi"); + } +} + +// ========================================================= +// Exports for Nim FFI +// ========================================================= + +export fn rumpk_console_write(ptr: [*]const u8, len: usize) void { + hal.console_write(ptr, len); +} + +export fn rumpk_palloc(pages: usize) ?*anyopaque { + return hal.palloc(pages); +} + +export fn rumpk_pfree(ptr: *anyopaque) void { + hal.pfree(ptr); +} + +export fn rumpk_halt() noreturn { + hal.halt(); +} diff --git a/io/governor.nim b/io/governor.nim new file mode 100644 index 0000000..6ed2295 --- /dev/null +++ b/io/governor.nim @@ -0,0 +1,61 @@ +# Rumpk Adaptive I/O Governor +# War Mode (polling) ↔ Peace Mode (interrupts) + +import ring + +const + POLL_BUDGET* = 2000 ## Cycles before switching to peace mode + PEACE_TIMEOUT_NS* = 1_000_000 ## 1ms before checking again + +type + GovernorMode* = enum + War, ## High load: 100% CPU polling + Peace ## Low load: Interrupt-driven + + IoGovernor*[T; N: static[int]] = object + mode*: GovernorMode + budget: int + ring*: RingBuffer[T, N] + + # Callbacks (set by driver) + hw_has_data*: proc(): bool {.nimcall.} + hw_fetch*: proc(): T {.nimcall.} + hw_enable_irq*: proc() {.nimcall.} + hw_disable_irq*: proc() {.nimcall.} + lwkt_yield*: proc() {.nimcall.} + +proc init*[T; N: static[int]](gov: var IoGovernor[T, N]) = + gov.mode = Peace + gov.budget = POLL_BUDGET + gov.ring.init() + +proc tick*[T; N: static[int]](gov: var IoGovernor[T, N]) = + ## Main driver loop iteration + + if gov.hw_has_data(): + # WAR MODE: Data available, stay aggressive + let data = gov.hw_fetch() + discard gov.ring.push(data) + gov.budget = POLL_BUDGET + gov.mode = War + + else: + # Speculation window + if gov.budget > 0: + dec gov.budget + # cpu_relax() equivalent - let other fibers run briefly + + else: + # PEACE MODE: Budget exhausted, sleep + gov.mode = Peace + gov.hw_enable_irq() + gov.lwkt_yield() + + # Woke up from interrupt + gov.hw_disable_irq() + gov.budget = POLL_BUDGET + +proc run*[T; N: static[int]](gov: var IoGovernor[T, N]) {.noreturn.} = + ## Infinite driver loop + while true: + gov.tick()