Operating System written for me
Go to file
Daniel Samson 6e0e0a62c6
virtio-gpu: a modern virtio 1.0 display driver, bring-up to a flushed frame (v2 V3)
The first native scanout backend's driver half. The device manager matches the
virtio-gpu PCI function by its Display/Other class triple and spawns the driver,
which claims the device, confirms vendor 0x1AF4/device 0x1050 from config space,
enables memory-space + bus mastering, and walks the virtio vendor capabilities to
find the common-config and notify structures in its BAR.

From there it is the standard modern-virtio bring-up: reset, negotiate VERSION_1,
stand up the control virtqueue in coherent DMA, then drive the GPU end to end —
RESOURCE_CREATE_2D, ATTACH_BACKING (a coherent DMA buffer; V4 swaps in the shm-
shared surface), SET_SCANOUT, paint a known pattern, TRANSFER_TO_HOST_2D,
RESOURCE_FLUSH, and wait for the device's used-ring ack. Reading the backing back
proves it is CPU-visible RAM; the ack proves the device consumed the frame —
together the automated stand-in for "it's on screen", no screenshot.

- system/drivers/virtio-gpu/: the driver, plus virtio-gpu-protocol.zig (control
  commands) and virtio-pci.zig (the 1.0 PCI transport + split-virtqueue), both with
  host-tested struct sizes.
- device-manager matches the display/other class triple to "virtio-gpu"; the driver
  self-confirms the vendor/device id, since the class alone cannot distinguish it.
- ServiceId.scanout (11): the driver registers it so the compositor finds it in V4.

Gate: python3 test/qemu_test.py virtio-gpu (QEMU -device virtio-gpu-pci) — the
device-manager stack discovers the function, the driver brings up a 640x480 scanout
and flushes a test pattern: "virtio-gpu: scanout 640x480 online" + "flush acked,
pixel check ok". host tests, display-service, shm, and device-list still pass.

Note: the pre-existing pci-scan case triple-faults on main (verified at 88ad432,
before this change); it is unrelated and tracked separately.
2026-07-14 11:29:53 +01:00
boot serial: make the log sink a build option, off by default 2026-07-13 22:05:08 +01:00
docs virtio-gpu: a modern virtio 1.0 display driver, bring-up to a flushed frame (v2 V3) 2026-07-14 11:29:53 +01:00
library kernel: shm cross-process shared memory capability (v2 V2) 2026-07-14 10:57:14 +01:00
system virtio-gpu: a modern virtio 1.0 display driver, bring-up to a flushed frame (v2 V3) 2026-07-14 11:29:53 +01:00
test virtio-gpu: a modern virtio 1.0 display driver, bring-up to a flushed frame (v2 V3) 2026-07-14 11:29:53 +01:00
tools M7: in-repo FAT32 image builder + boot the whole system off a USB stick 2026-07-13 15:34:18 +01:00
.editorconfig editorconfig 2026-07-12 16:09:11 +01:00
.gitattributes gitattributes 2026-07-12 16:09:18 +01:00
.gitignore gitignore: ignore .claude/ and .github/ 2026-07-10 14:09:38 +01:00
.zig-version Pin zig version to 0.16 LTS 2026-07-03 13:49:47 +01:00
README.md Docs: link README to system-requirements.md 2026-07-13 11:10:24 +01:00
build.zig virtio-gpu: a modern virtio 1.0 display driver, bring-up to a flushed frame (v2 V3) 2026-07-14 11:29:53 +01:00
build.zig.zon started project with basic efi setup 2026-07-01 18:32:56 +01:00

README.md

DanOS

Codename: Shodan Version: 1

A small resilient operating system, written from scratch in Zig.

Zen of DanOS:

  • Resilient Micro-Kernel Architecture.
    • Every process run in an isolated user space not kernel space.
    • Processes cannot take down the entire OS with it when they die or is killed
  • Stable public runtime library, private OS ABI.
    • Keeps a stable runtime for user space processes between OS versions (great for backwards compatibility)
    • Allows the underlying OS to be changed without effecting applications
    • Provides a boundary to enable compatibility between OS's e.g. POSIX, MUSL etc
  • Drivers are just isolated processes in user space.
    • Thin binaries that can be restarted like applications.
    • Useful during driver development.
    • Drivers can claim MMIO / ports
    • Driver resources (e.g. IRQ/Port/MMIO) claims are automatically cleaned up if the driver dies or is killed
    • Drivers can also hook into the process lifecyle to clean up or reset hardware
  • No legacy to deal with
    • Zig code uses a clean coding style (Zen of Zig)
    • Favor reading code over writing code.
    • No magic numbers.
    • No shortend names unless its for ABI compatibility or acronyms
  • Inter-Process Communication (IPC)
    • Publish and subscribe to Asynchronous Messages
    • Talk to services and processes synchronously

Prerequisites

  • Zig 0.16.x — the build is pinned to this line (.zig-version); other minor versions are rejected, because Zig makes breaking changes between releases pre-1.0. A toolchain manager such as zvm or zigup will pick up .zig-version automatically.
  • QEMU (qemu-system-x86_64) — to run and test the kernel. On macOS, brew install qemu also bundles the OVMF firmware below.
  • OVMF UEFI firmware — the edk2-ovmf package (Arch), ovmf (Debian/Ubuntu), or edk2-ovmf (Fedora); on macOS it ships inside the Homebrew qemu formula. Both the build and the test harness probe the known Arch/Debian/Fedora/macOS layouts and use the first that exists, so no configuration is normally needed. Override with -Dovmf-code= / -Dovmf-vars= (build) if yours lives elsewhere.
  • Python 3 — for the QEMU integration test harness.

Build

zig build

Produces a FHS-shaped zig-out/ that is the danos filesystem and the boot volume: the UEFI bootloader at zig-out/EFI/BOOT/BOOTX64.efi, the kernel at zig-out/system/kernel, init at zig-out/system/services/init, drivers under zig-out/system/drivers/, and the initial-ramdisk at zig-out/boot/.

Run

Boot it in QEMU with OVMF (opens a display window):

zig build run-x86-64
# distro with OVMF elsewhere:
zig build run-x86-64 -Dovmf-code=/path/OVMF_CODE.fd -Dovmf-vars=/path/OVMF_VARS.fd

Test

zig build test            # host unit tests (the platform-independent shared code)
python3 test/qemu_test.py  # QEMU integration tests: boots the kernel and asserts
                           # on its serial output (see docs/testing.md)

The integration harness builds and boots the kernel once per test case, checking memory, the frame allocator, paging (incl. NX and the null guard), the heap, interrupts, and exception handling. It exits non-zero on any failure, so it drops straight into CI.

Documentation

Design notes explaining why behind the code live in docs/ — start with docs/README.md.

For the hardware needed to run DanOS — minimum specs plus a plain-language guide matching Intel/AMD CPU generations by name — see docs/system-requirements.md.

San Serif Text "Dan OS" with a black karate belt around it.