Skip to content

Substrates

A substrate is the isolation mechanism that runs a service inside a SpaceOS partition. The runtime selects it from service metadata, the target profile’s declared backends, and the service-level isolation field in run.yaml.

Example

A run.yaml service can request a substrate with isolation:

partitions:
payload:
memory: 256
services:
- name: eo-classifier
isolation: runc
- name: sdls-downlink
isolation: hvt

Substrate matrix

A service can name these backends in isolation:

SubstrateIsolationHost requirementArchitecturesWorkload
Solo5/KVM (hvt)Hardware virtual machineKVMx86-64, arm64MirageOS and Unikraft unikernels
runc (runc)Linux namespaces, cgroups, and seccompLinuxx86-64, arm64OCI containers
Solo5/spt (spt)Seccomp process sandboxLinuxx86-64, arm64Solo5 unikernels
QEMU (qemu)Emulated virtual machineQEMU on x86-64x86-64Unikraft unikernels
Firecracker (firecracker)Hardware micro-VM, reduced device surfaceKVMx86-64, arm64Linux micro-VM images
Host process (host)NoneDevelopment hostx86-64, arm64Test fixtures

The substrate determines the strength of the isolation guarantee. The manifest format stays the same: one build.yaml composition runs on any backend that satisfies the service’s requirements, and run.yaml picks the backend per service.

Host hypervisors

Solo5 defines a host interface of about ten calls, so any hypervisor or separation kernel that implements it can run a MirageOS unikernel unmodified. Host hypervisors sit beneath isolation backends rather than being named in isolation:

  • Xen. Type-1 hypervisor, validated on arm64, in two shapes:

    • Static, dom0less. Xen starts each domain itself at boot from the device tree. There is no dom0 and no toolstack, so nothing on the running system can create, destroy, or inspect a domain, and the resource assignment is fixed when the image is built. A domain grants pages and opens event channels to itself rather than to a control domain.
    • Dynamic. An ordinary guest under a dom0 running the xl toolstack, reaching network and block backends through the usual XenStore rendezvous.

    The static shape removes the Linux control domain and all runtime domain management from the trusted computing base.

  • Muen [roadmap]. Separation kernel written in Ada/SPARK, with absence of runtime errors proven. x86-64 only. It runs SpaceOS but is not part of a validated configuration.

  • seL4 [roadmap]. Microkernel whose functional correctness is verified in Isabelle/HOL. arm64 only, and a working prototype rather than a supported path.

seL4’s proofs cover specific verified configurations. The Microkit framework, the virtual-machine monitor, and the device drivers used by SpaceOS sit outside that proof boundary, so the verification claim does not extend to the whole running system.

Acceleration

Accelerator access (GPU, FPGA, AI engine) is a fact of the target profile, not of the substrate table: a profile declares the device classes it grants, a privileged broker mediates access against the partition’s signed capability envelope, and direct passthrough requires a dedicated device and an IOMMU. Targets without both requirements disable passthrough and preserve the isolation boundary.