NaOS is a usable operating system written from scratch: its own UEFI bootloader, its own kernel, FAT32 storage, multitasking, USB keyboard and a TCP/IP stack. No GRUB. No libc. No prebuilt OS code.
Every line below the firmware is ours — bootloader, kernel, drivers, filesystem, scheduler, network stack.
Custom BOOTX64.EFI in C: GOP framebuffer, ELF64 parsing, one-shot ExitBootServices, clean handoff — plus a shell auto-boot fallback.
A NaOS> prompt with 39 commands, history, scrollback, font sizes, output redirect and a themeable prompt.
AHCI, NVMe and ATA under one block layer, writable FAT32, long filenames — and a live RAM copy of the boot volume, so the ISO boots with files anywhere.
Ring-3 tasks with private address spaces, preemptive scheduler, syscalls, copy-on-write fork(), disk-loaded ELF programs with file I/O.
E1000 driver with ARP, ping, UDP sockets, DHCP, DNS and a TCP client — fetch pages over HTTP, update pulls verified downloads.
Polled XHCI stack with hotplug rescan next to the classic PS/2 driver. PC-speaker beeps included.
No Unix-isms. Type what you mean at the NaOS> prompt.
Seven steps from power-on to prompt. Measured on QEMU q35 + OVMF, typical run.
| # | Stage | What happens | Artifact |
|---|---|---|---|
| 00 | UEFI firmware | Mounts the ESP, runs the fallback loader | \EFI\BOOT\BOOTX64.EFI · ~17 KB |
| 01 | BOOTX64.EFI | GOP framebuffer, parses ELF64, stages a live RAM copy of the boot volume | \NaOS\KERNEL.ELF → 0x100000 |
| 02 | ExitBootServices | One-shot exit; hands a bootinfo struct down | NAOS_BOOTINFO_MAGIC |
| 03 | kernel_entry | GDT · IDT · PIC · PIT 100Hz · PMM · own PML4 · heap | CR3 switch, 16 task slots |
| 04 | Drivers | Block (AHCI → NVMe → ATA → RAM copy) · FAT32 · USB · E1000 | blk: using … |
| 05 | Network | Static IP, then DHCP lease when a server answers | 10.0.2.15/24 via 10.0.2.2 |
| 06 | NaOS> shell | Settings load, 39 commands, blinking cursor | /SETTINGS.TXT |
Detour path: if firmware drops to its shell instead, \startup.nsh auto-boots us after the countdown — no typing needed.
Physical layout. Values typical for QEMU q35 + 256M (PMM reports ~52K free pages at boot).
| Range | Use |
|---|---|
| 0x000000–0x09FFFF | Low memory — firmware-owned until ExitBootServices |
| 0x100000 … | Kernel ELF LOAD segments, entry kernel_entry |
| < 0x40000000 | Live RAM copy of the boot volume (Block I/O, staged pre-exit) |
| 0x40100000… | Ring-3 programs (fixed base, private tables per task) |
| 0 … 1G identity | Own PML4: identity 0–1G + framebuffer window, 2M pages |
| EfiConventionalMemory | PMM free-page stack · 4KB pages · 8KB kernel / 16KB user stacks |
Ring-3 gate: int 0x80. Ten calls, 0–9. Max 2048 bytes per call; 8 fds per task, opens start at 3.
| # | Call | Signature |
|---|---|---|
| 0 | exit | exit() |
| 1 | print(s, len) → written | |
| 2 | yield | yield() |
| 3 | getpid | getpid() → id |
| 4 | sleep | sleep(ticks) |
| 5 | fork | fork() → child pid (CoW) |
| 6 | open | open(path, 0=r|1=w|2=a) → fd |
| 7 | read | read(fd, buf, len) → bytes |
| 8 | write | write(fd, buf, len) → bytes |
| 9 | close | close(fd) — flushes writes |
What v0.1.0 does not do. No asterisks hidden anywhere else on this page.
| Area | Limit | Tracks to |
|---|---|---|
| TCP | Client only — no listen/accept | done in v0.2.0 |
| TLS | None — updates over plain HTTP only | later |
| NVMe | 512-byte namespaces, one I/O queue pair, polled | v0.2.0 |
| Optical/USB storage | No ATAPI, no USB mass — CD/USB boot uses the RAM session | later |
| NaOS-FS | Read-only guest; writes later | done in v0.2.0 |
| Hardening | No ASLR, no stack protector, no signatures | later |
| Firmware | UEFI-only 64-bit, Secure Boot off | by design |
Each release is a frozen snapshot — source, tools, docs and changelog included. Browse all versions →
Shell · FAT32 + live RAM copy · multitasking + fork · USB keyboard · UDP/DHCP/DNS/TCP + updater · AHCI/NVMe/ATA · NaOS-FS reader.
Windows + MSYS2 UCRT64, QEMU, and the /opt/cross toolchain. Full setup in the version README.
# inside versions/v0.1.0 export PATH=/opt/cross/bin:$PATH ./tools/check.sh # verify every tool + OVMF make all # BOOTX64.EFI + KERNEL.ELF make esp # 64M FAT ESP image make run # QEMU + OVMF → NaOS> shell
No build? Grab NaOS.v0.1.0.iso from the release, boot it with Rufus (DD mode, Secure Boot off) — or browse the code online.
loading…