Operating System written for me
Go to file
Daniel Samson 31bf86af56 IPC 2026-07-03 15:09:16 +01:00
docs IPC 2026-07-03 15:09:16 +01:00
src IPC 2026-07-03 15:09:16 +01:00
test IPC 2026-07-03 15:09:16 +01:00
.gitignore started project with basic efi setup 2026-07-01 18:32:56 +01:00
.zig-version Pin zig version to 0.16 LTS 2026-07-03 13:49:47 +01:00
README.md Pin zig version to 0.16 LTS 2026-07-03 13:49:47 +01:00
build.zig Pin zig version to 0.16 LTS 2026-07-03 13:49:47 +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 x86-64 operating system kernel, written from scratch in Zig. It boots via UEFI, and so far has a framebuffer console, a physical frame allocator, its own paging with W^X permissions, interrupt/exception handling, a LAPIC timer, and a kernel heap. See docs/ for how each piece works.

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.
  • OVMF UEFI firmware — the edk2-ovmf package (Arch), ovmf (Debian/Ubuntu), or edk2-ovmf (Fedora). The build defaults to the Arch paths (/usr/share/edk2/x64/OVMF_{CODE,VARS}.4m.fd); override with -Dovmf-code= and -Dovmf-vars= if your distro installs them elsewhere.
  • Python 3 — for the QEMU integration test harness.

Build

zig build

Produces the UEFI bootloader (zig-out/bin/BOOTX64.efi) and the kernel ELF (zig-out/bin/danos).

Run

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

zig build run-efi
# distro with OVMF elsewhere:
zig build run-efi -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 the why behind the code live in docs/ — start with docs/README.md.

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