YGG / WP–001 16 August 2026 Revision 1.0

Yggdrasil architecture paper

Processes all
the way down.

An operating system where everything is a process. A design argument, an implementation record, and the boundaries that remain.
Xenomorph Tech Rust · x86_64 · Lux Public implementation
00Abstract

Yggdrasil asks what an operating system becomes when the process model of a language runtime is not placed above the kernel, but used to construct it.

The durable unit is a small, supervised process with an isolated heap, native stack, mailbox, and bounded resources. Processes communicate by value. Schedulers are per-CPU. Devices appear through queue-backed ports whose completions return as ordinary messages.

Verified bytecode and controlled native-code publication provide software isolation inside one privilege ring. This paper describes that architecture, the constraints it creates, and the eleven implemented milestones that make the argument executable.

01 / Thesis

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.

02 / Process model

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.

01Processheap + stack
copy
02Mailboxvalues
yield
03Schedulerper CPU
submit
04PortSQ / CQ

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.

ALocal by default

Current process, run queue, preemption state, descriptor tables, and interrupt stacks belong to one CPU.

BFailure stays named

Links and monitors turn failure into explicit process relationships instead of shared-state corruption.

CResources are bounded

Heap caps, stack guards, reductions, and verifier limits make the cost of a process visible.

DWork may move

Idle schedulers steal runnable processes; ownership moves through a protocol, never by accidental aliasing.

03 / Isolation

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.

LoadVerify bytecode

Reject malformed control flow, invalid operands, and programs outside the accepted instruction contract.

RunBound execution

Count reductions, guard stacks, cap heaps, and keep process ownership explicit across scheduling points.

PromotePublish controlled native code

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.

04 / Execution and time

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.

T0Bytecodeverified module
T1Interpretersafe fallback
T2Craneliftnative lowering
T3RX zonepublished code

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.

05 / Devices

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.

Processencode bytes
Portmove buffer
Virtqueuenotify device
Mailboxreceive completion

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.
06 / Build record

The argument, made executable.

Each milestone turns another conventional operating-system boundary into a runtime primitive.

  1. M0BootLimine · serial · paging
  2. M1Memoryframes · heaps · stacks
  3. M2Processesspawn · yield · exit
  4. M3Semanticsmailboxes · links · monitors
  5. M4Bytecodeterms · interpreter · assembler
  6. M5Portsrings · IRQs · timers
  7. M6Virtioblock · net · persistence
  8. M7Verifierisolation · mutation fuzzing
  9. M8Native codehot load · Cranelift JIT
  10. M9MulticoreSMP · IPIs · work stealing
  11. M10Lux TCP/IP54 verified modules · real host TCP
  12. M11Device driversGC · tail calls · Lux GPU
07 / Boundaries

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.

01
Collection happens at outer execution hops.

Long allocation-heavy function bodies still need explicit safepoints before reclamation can become fully general.

02
The term surface is narrower than the intended language.

Floats, arrays, richer binary forms, and their exact tracing rules remain future runtime work.

03
The GPU path waits synchronously for completions.

Async fences and multiple in-flight submissions are necessary before the model can carry deeper graphics pipelines.

04
Ring-zero software isolation is a continuing claim.

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.