Skip to content

Single-level store

In a conventional system, data has two shapes: the in-memory representation and the on-disk representation, with a serialize/deserialize step bridging them. That step is pure overhead — it costs energy, it introduces bugs, and it is the reason you have a “save” button.

JouleOS deletes it. The in-memory bytes are the durable bytes.

Surface, SurfaceContent, intent history, and the capability ledger all live in an mmap’d arena keyed by stable ObjIds. There is one representation. A pointer into the arena is a durable reference.

ObjId ──► arena offset ──► the bytes (in memory == on disk)

Every mutation is wrapped in a per-mutation transaction (Tx) with an undo log. The guarantee:

A power loss at any instruction boundary either rolls back cleanly or commits cleanly. The store never tears.

This is the property that lets us drop the save dialog without lying to the user about durability.

The design descends from two research systems, rebuilt lean:

  • Twizzler (USENIX ATC ‘20) — a data-centric OS for byte-addressable persistent memory.
  • Corundum (ASPLOS ‘21) — a Rust library for crash-consistent persistent objects.

The single-level-store cutover landed across a 21-substep migration; see the conformance suite for the invariants that hold it in place.