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.
How it works
Section titled “How it works”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)Crash safety: never tears
Section titled “Crash safety: never tears”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.
Lineage
Section titled “Lineage”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.