The kernel is not a container for applications. It is the runtime.
Conventional operating systems organize the machine around address spaces, files, privilege boundaries, and threads. Language runtimes then rebuild another world above them: lightweight processes, schedulers, mailboxes, supervision, and code loading.
Yggdrasil removes that duplication. Its central abstraction is the same at the language level and at the bottom of the machine: a process that owns its state, receives values, yields under a reduction budget, and can fail without making failure ambient.
The wager is not that every resource literally becomes executable. It is that every durable activity has a process owner, and every boundary is expressed in process terms.
This shifts operating-system design away from “which syscall exposes this facility?” toward “which process owns it, what messages cross its boundary, and how is it supervised?” Files, sockets, timers, and devices remain real. They stop being the organizing principle.
Isolation is the default shape of state.
A Yggdrasil process owns an isolated heap and native stack. It shares neither with its neighbors. Its public surface is a mailbox.
Messages move ownership into the open.
A sender constructs a self-contained heap fragment. A receiver copies the fragment into its own heap when it receives. No core writes another process’s heap, and no borrowed pointer silently extends the lifetime of another process’s data. Copying is a cost, but it is also an accounting boundary and a concurrency protocol.
Current process, run queue, preemption state, descriptor tables, and interrupt stacks belong to one CPU.
Links and monitors turn failure into explicit process relationships instead of shared-state corruption.
Heap caps, stack guards, reductions, and verifier limits make the cost of a process visible.
Idle schedulers steal runnable processes; ownership moves through a protocol, never by accidental aliasing.
One hardware ring. Several software boundaries.
Yggdrasil currently runs the runtime and verified programs in ring zero. That makes the verifier, code generator, allocator, and quota system part of the security boundary.
Reject malformed control flow, invalid operands, and programs outside the accepted instruction contract.
Count reductions, guard stacks, cap heaps, and keep process ownership explicit across scheduling points.
Compile through Cranelift, apply known relocations, and expose code only after it enters the RX publication path.
This is not a claim that software isolation is free or automatically equivalent to an MMU boundary. It concentrates trust differently. The benefit is a common runtime model without a privilege transition on every useful act; the obligation is unusually strong verification, testing, fuzzing, and resource discipline.
Interpret first. Promote carefully. Keep the process alive.
Verified bytecode begins in the interpreter and may be promoted to native code. The interpreter remains the semantic baseline; differential tests keep both engines honest.
Proper tail calls return a reserved sentinel to an outer dispatch loop instead of nesting the native stack. At that same outer hop, stashed arguments are the complete root set for moving garbage collection. Hot-code migration, constant-stack execution, and reclamation therefore meet at one explicit runtime boundary.
A driver is a process that speaks a device protocol.
Serial, block, network, and GPU transports appear as queue pairs. Submission enters a port; completion returns to the owner’s mailbox as an ordinary term.
The kernel need not grow a protocol-shaped API for every device. In M11, a Lux process encoded virtio-gpu commands, owned a pinned framebuffer, parsed responses, paced an animation, and presented real pixels. The kernel supplied protected physical-memory facts and moved opaque buffers. Protocol policy stayed in the supervised process.
Field Note 011See the captured framebuffer and proof matrix.↗The argument, made executable.
Each milestone turns another conventional operating-system boundary into a runtime primitive.
- M0BootLimine · serial · paging
- M1Memoryframes · heaps · stacks
- M2Processesspawn · yield · exit
- M3Semanticsmailboxes · links · monitors
- M4Bytecodeterms · interpreter · assembler
- M5Portsrings · IRQs · timers
- M6Virtioblock · net · persistence
- M7Verifierisolation · mutation fuzzing
- M8Native codehot load · Cranelift JIT
- M9MulticoreSMP · IPIs · work stealing
- M10Lux TCP/IP54 verified modules · real host TCP
- M11Device driversGC · tail calls · Lux GPU
What the current result does not prove.
M11 validates a vertical slice; it does not close the architecture. Several useful restrictions remain visible by design.
Long allocation-heavy function bodies still need explicit safepoints before reclamation can become fully general.
Floats, arrays, richer binary forms, and their exact tracing rules remain future runtime work.
Async fences and multiple in-flight submissions are necessary before the model can carry deeper graphics pipelines.
Every new opcode, compiler lowering, and raw port capability must preserve the verifier’s boundary under hostile input.
The tree is alive. It is not finished growing.