A QNX-inspired operating system with selectable kernels

edvinbesic1 pts0 comments

QSOE Systems

QSOE

A QNX-inspired operating system with selectable kernels.

News: QSOE 0.1 is out — the first public release of<br>the unified two-kernel system (June 2026).<br>Read the<br>announcement →

QSOE ships in two variants that share one userspace and one build system.<br>QSOE/N runs on Skimmer , a microkernel written<br>from scratch for this project (SMP by design); QSOE/L runs on<br>seL4 as its kernel.

Both variants, when compiled, offer the kernel and initrd files directly usable in<br>e.g. U-Boot loader. The userspace is 100% identical across<br>both variants; the only parts produced per-kernel are taskman, the task<br>manager, and libc.so — the C library, which is around 85% shared at the source<br>level and diverges only at the thin layer where it meets the kernel.

The design follows the QNX Neutrino tradition: a small kernel with everything else in<br>userspace, synchronous message-passing IPC, and the resource-manager model for services.

QSOE targets 64-bit RISC-V (RV64, Sv39) on the SiFive HiFive<br>Unmatched (FU740), with QEMU used for day-to-day development. Both QSOE variants<br>now boot on real hardware. Released under Apache-2.0.

gitlab.com/qsoe/os<br>dev blog

Downloads

QSOE can be built from source or installed from pre-built binaries. Ready-made<br>images for each release are published at<br>github.com/qsoe-dev/dl<br>(current release: 0.1 ). The files are:

skimmer.bin<br>— the Skimmer microkernel: the kernel of the QSOE/N variant. A raw<br>binary image, loaded by the bootloader (or QEMU) together with the userspace package below.

modpkg.cpio<br>— the module package: the shared QSOE userspace (taskman, init, the C library,<br>the shell, drivers and utilities) as a CPIO archive. QSOE/N boots it as an<br>initrd alongside skimmer.bin.

qsoe-l-qemu.elf<br>— the QSOE/L variant (on the seL4 kernel) as a single, self-contained ELF<br>for the QEMU virt machine. It bundles the elfloader, the seL4 kernel, taskman and<br>the userspace together — nothing else is needed to boot.

qsoe-l-sifive.elf<br>— the same QSOE/L image, built for the SiFive HiFive Unmatched (FU740) board.

mrbml-riscv64.efi<br>— mr-bml , QSOE's own bootloader (an EFI application for RISC-V). It<br>can load either variant and drives the boot menu on real hardware.

nvme.img.gz<br>— a ready-to-run, self-booting QEMU disk image (GPT). Its EFI partition holds<br>mr-bml, and an on-disk root holds both kernels — so QEMU boots straight to the<br>mr-bml menu, no -kernel needed. The fastest way to see QSOE run; see<br>Running under QEMU below.

virtio.img.gz<br>— a companion root disk used only when running QSOE/L under QEMU<br>(stock seL4 predates the interrupt controller QEMU's NVMe needs, so it mounts its root from a<br>virtio disk instead). Not needed for QSOE/N or for real hardware.

In short: to run it in QEMU , grab nvme.img.gz<br>(plus virtio.img.gz for QSOE/L) and see Running under QEMU .<br>To put it on real hardware , you need mrbml-riscv64.efi<br>plus the kernels — QSOE/N uses skimmer.bin + modpkg.cpio,<br>QSOE/L uses one of the qsoe-l-*.elf images — and see<br>Installation .

Running under QEMU

The quickest way to see QSOE run — no hardware, no -kernel juggling. The<br>nvme.img download is a self-booting UEFI disk: QEMU's firmware runs<br>mr-bml from it, and mr-bml's menu starts either variant straight off the disk.

You need

qemu-system-riscv64 — version 11.0.1 or newer for QSOE/N<br>(its NVMe needs the AIA interrupt controller).

edk2 RISC-V UEFI firmware — on Debian/Ubuntu, the qemu-efi-riscv64 package.

The launcher run-nvme.sh<br>from the os repository — it wraps the right QEMU<br>machine, firmware and disks for each variant, so you don't have to.

Run it

# unpack the image(s) — add virtio.img.gz only if you want QSOE/L<br>gunzip nvme.img.gz virtio.img.gz

# point the launcher at them and pick a variant from its menu<br>NVME_IMG=./nvme.img VIRTIO_IMG=./virtio.img ./run-nvme.sh<br>Pass n or l to skip the menu (./run-nvme.sh n). The script<br>selects the matching QEMU machine automatically — QSOE/N on the AIA machine with an NVMe root,<br>QSOE/L on the PLIC machine with the virtio root disk. The mr-bml menu and the system console<br>both appear on your terminal; choose a variant and it boots to a login: prompt.<br>Log in as root with password QSOE.

Installation

Real hardware, real disk. QSOE 0.1 boots on the SiFive HiFive Unmatched (FU740); the SpaceMiT<br>K3 is a future target. This assumes a board already running Linux — you'll be placing files on<br>its existing EFI and boot partitions, so familiarity with the board's firmware is expected.

The boot model is simple: mr-bml lives in the EFI System Partition; it reads<br>its menu and the kernels from an ext2/3/4 partition; the chosen variant then<br>mounts its own root from a fs-qrv partition.

Steps

Copy mrbml-riscv64.efi into your ESP as<br>EFI/BOOT/BOOTRISCV64.EFI (the UEFI removable-media path), or register it with<br>efibootmgr as a boot entry.

On your boot/root filesystem, create /boot/qsoe/ and copy the kernels there:<br>skimmer.bin + modpkg.cpio for QSOE/N,<br>qsoe-l-sifive.elf for QSOE/L.

Create...

qsoe qemu kernel nvme boot from

Related Articles