11 KiB
System Requirements
Minimum and recommended hardware for running danos. Every requirement below is grounded in what the current code actually assumes at boot — this is a description of the real target, not an aspirational one.
Summary
danos targets a modern UEFI x86-64 PC with ACPI and PCIe. The practical minimum is:
- 64-bit x86-64 CPU with SSE2, APIC, and
syscall/sysret - UEFI firmware (no BIOS / legacy boot)
- ACPI tables: MADT, MCFG, FADT
- PCIe with an ECAM (MMConfig) window
- 128 MiB RAM (target); see Memory for the breakdown
- USB via xHCI only
There is no support for legacy BIOS boot, x2APIC, port-IO PCI configuration, or any USB host controller other than xHCI.
Plain-language hardware guide
If you don't want to cross-reference chipset datasheets, here's roughly what era of PC works. These are guidance based on when the required features became standard, not a list of tested machines — the authoritative rules are in the technical sections below.
The feature that sets the floor is built-in xHCI USB (danos supports no other USB controller) combined with UEFI firmware. Both became standard on mainstream desktops and laptops around 2012.
| Known-good baseline | Comfortable recommendation | |
|---|---|---|
| Intel | 3rd-gen Core "Ivy Bridge" (2012) with a 7-series "Panther Point" chipset — Intel's first chipset with xHCI built in | 6th-gen Core "Skylake" (2015) or newer |
| AMD | A-series "Llano" APU with an A75 FCH (2011) — the industry's first chipset with built-in xHCI | Any AM4 platform, i.e. Ryzen (2017) or newer |
AMD is not behind Intel here — it was first. AMD's A75 FCH shipped with native xHCI in April 2011, about a year ahead of Intel's 7-series (2012); AMD was the first vendor to earn USB-IF certification for chipset-level USB 3.0. The two "comfortable recommendation" dates differ only because they name convenient, long-supported product lines (Skylake, Ryzen) — not because of any USB capability gap. Every AMD desktop platform from the A75 FCH (2011) and FM2/AM3+ era onward has built-in xHCI, and any of them qualifies as a baseline.
Older 64-bit machines (e.g. Intel Core 2, Nehalem, Sandy Bridge) meet the CPU requirements but typically lack built-in xHCI and/or ship with BIOS instead of UEFI, so they are not supported.
Matching your CPU by name
If you know your chip's marketing name or codename, find it here. Everything from the Supported rows down works; the Too old row does not.
Intel Core (the "-lake"/"-bridge"/"-well" codenames):
| Status | Generation | Codename(s) | Year |
|---|---|---|---|
| Too old | 2nd gen | Sandy Bridge | 2011 |
| Supported (baseline) | 3rd gen | Ivy Bridge | 2012 |
| Supported | 4th–5th gen | Haswell, Broadwell | 2013–2014 |
| Recommended | 6th–9th gen | Skylake, Kaby Lake, Coffee Lake | 2015–2018 |
| Recommended | 10th–11th gen | Comet Lake, Ice Lake, Tiger Lake, Rocket Lake | 2019–2021 |
| Recommended | 12th gen+ | Alder Lake, Raptor Lake | 2021–2023 |
| Recommended | Core Ultra | Meteor Lake, Arrow Lake, Lunar Lake | 2023+ |
AMD:
| Status | Family | Codename(s) | Year |
|---|---|---|---|
| Supported (baseline) | A-series APU (A75/A85 FCH) | Llano, Trinity, Richland, Kaveri | 2011–2014 |
| Supported | FX (AM3+) | Bulldozer, Piledriver | 2011–2012 |
| Recommended | Ryzen 1000–5000 (AM4) | Summit/Pinnacle Ridge, Matisse, Vermeer (Zen–Zen 3) | 2017–2020 |
| Recommended | Ryzen 7000+ (AM5) | Raphael, Granite Ridge (Zen 4 / Zen 5) | 2022+ |
| Recommended | Threadripper / EPYC | Zen and later | 2017+ |
(These map generations to the era their platforms shipped built-in xHCI + UEFI; they are guidance, not a tested-hardware list.)
Two caveats that matter regardless of CPU:
- Firmware must be UEFI. Many 2011-era machines could do either UEFI or legacy BIOS — danos needs it set to UEFI. There is no BIOS boot path.
- Input is PS/2 only, for now. danos does not yet support USB keyboards/mice. This is fine on most laptops (their built-in keyboards are wired to a PS/2-style i8042 controller) but means a desktop with only USB ports currently has no usable keyboard. USB HID input is planned.
Virtual machines are the easiest way to meet every requirement: QEMU (with OVMF/
UEFI, a qemu-xhci controller, and the default Q35 machine type), or any
hypervisor configured for UEFI firmware and an xHCI USB controller.
CPU / architecture
| Requirement | Detail | Source |
|---|---|---|
| x86-64, 64-bit only | Kernel and loader are built exclusively for x86_64; the loader rejects any non-x86-64 kernel ELF (error.WrongArchitecture). |
build.zig:285, boot/efi.zig:418 |
| Long mode + PAE + NX | AP trampoline sets CR4.PAE, EFER.LME, EFER.NXE; NX is used in kernel page-table entries. |
system/kernel/architecture/x86_64/trampoline.s:62 |
| SSE / SSE2 | Baseline: the compiler emits SSE for ordinary struct copies. Trampoline enables CR4.OSFXSR + OSXMMEXCPT and clears CR0.EM. |
build.zig:282, trampoline.s:62 |
syscall / sysret |
Primary user↔kernel entry path. EFER.SCE enabled; STAR/LSTAR/SFMASK programmed per core. (int 0x80 exists as a parallel gate.) |
architecture/x86_64/per-cpu.zig:59, isr.s:169 |
| Local APIC (xAPIC) | LAPIC accessed via MMIO at 0xFEE00000. LAPIC ID read as a u8 — classic xAPIC. x2APIC is not supported (no MSR path). |
apic.zig:62, apic.zig:414 |
| CPUID + RDTSC | CPUID leaf 0x15 for TSC frequency; RDTSC is the monotonic clock. |
apic.zig:279, apic.zig:84 |
| SMP (optional) | Multi-core supported via INIT–SIPI–SIPI; ceiling maximum_cpus = 128. Single core is fine. Cores beyond the ceiling are parked. |
system/parameters.zig:16, apic.zig:144 |
Firmware / boot
- UEFI only. A custom UEFI application loader is installed to
\EFI\BOOT\BOOTX64.efi. There is no BIOS, multiboot, or limine path. The loader tolerates UEFI Class-3 machines with no legacy PIC/PIT. (build.zig:464,boot/efi.zig) - ACPI is the hardware-discovery mechanism. The RSDP is taken from the UEFI
configuration table (ACPI 2.0 GUID preferred, 1.0 fallback). Without a valid
RSDP there is no device discovery — no SMP, no IOAPIC routing, no PCI/USB.
(
efi.zig:578,boot-handoff.zig:144) - Required ACPI tables: MADT (interrupt topology), MCFG (PCIe ECAM base),
FADT (power / PM timer). Optionally consumed: HPET, DMAR, SPCR.
(
system/devices/acpi.zig:3) - The loader reads
/system/kernel,/system/services/init, and/boot/initial-ramdisk.imgoff the FAT boot volume. The kernel can boot "kernel-only" without init or the ramdisk. (efi.zig:14,efi.zig:66)
Interrupt controller
- Local APIC + I/O APIC required. I/O APIC base, GSI base, and MADT
interrupt-source overrides come from ACPI. (
cpu.zig:365,apic.zig:119) - MSI supported — edge-triggered, keyed by vector, no I/O APIC mask cycle.
Vector window 33–46, timer on 32, spurious on 47. (
system/kernel/irq.zig:70,cpu.zig:397) - The legacy 8259 PIC is remapped and masked only if present (MADT
PCAT_COMPAT); it is not required. (apic.zig:103)
PCI / PCIe
- PCIe with ECAM (MMConfig) required. The PCI bus driver maps the host
bridge's ECAM window (1 MiB config space per bus) and computes config
addresses directly. There is no legacy CF8/CFC port-IO config path — the
driver bails if the bridge exposes no ECAM window. The ECAM base comes from
the ACPI MCFG table. (
system/drivers/pci-bus/pci-bus.zig:41,acpi.zig:6)
USB
- xHCI only. The sole USB driver is
usb-xhci-bus, and the device manager binds it strictly to PCI prog-IF0x30(xHCI). UHCI / OHCI / EHCI exist only as report strings with no driver behind them — USB 1.x/2.0-only controllers are not supported. (system/drivers/usb-xhci-bus/,system/services/device-manager/device-manager.zig:34) - USB input (keyboard/mouse over HID) is future work; the current input stack is PS/2. See Buses & devices.
Timers
Calibration prefers, in order: (1) CPUID leaf 0x15 TSC frequency, (2) HPET,
(3) ACPI PM timer (3.579545 MHz, from FADT), (4) legacy PIT. Any one suffices —
HPET/PM-timer/PIT are optional fallbacks when CPUID 0x15 is absent.
(apic.zig:180)
- TSC — monotonic high-resolution clock.
- LAPIC timer — scheduler heartbeat, periodic at
timer_hz = 1000 Hz. (parameters.zig:39)
Memory
Target: 128 MiB RAM. The system uses 4 KiB pages and a bitmap physical-frame
allocator built from the firmware memory map. There is no hardcoded minimum-RAM
constant — the allocator only panics if there is no usable region, or none large
enough to hold its own bitmap. (system/kernel/pmm.zig:13, pmm.zig:77)
Where the budget goes:
| Consumer | Size | Source |
|---|---|---|
| Kernel heap (cap, grown one page at a time) | up to 64 MiB | system/kernel/heap.zig:26 |
| Kernel stack, per CPU | 16 KiB | parameters.zig:26 |
| IST stack, per CPU | 16 KiB | parameters.zig:36 |
| User stack, per task | 8 pages / 32 KiB | parameters.zig:32 |
| Max concurrent tasks | 32 | parameters.zig:23 |
| Boot page-table pool | 64 frames / 256 KiB | efi.zig:299 |
The 64 MiB heap cap plus kernel image, per-CPU stacks, task stacks, the frame bitmap, and DMA-contiguous allocations fit comfortably within 128 MiB on a single- or low-core-count machine. Very high core counts (toward the 128-CPU ceiling) add per-CPU stack overhead and push toward more RAM.
Note on the 4 GiB physmap: the loader identity-maps and physmaps the low
4 GiB of address space with 2 MiB leaves. This is virtual address reach, not a
RAM requirement — RAM above 4 GiB simply needs an extra mapping window and is not
needed to boot. (efi.zig:305)
Virtual-memory layout (boot-handoff.zig:47):
| Region | Base |
|---|---|
| User space | 0x0000_7000_0000_0000 |
| Kernel heap | 0xFFFF_8000_0000_0000 |
| Physmap | 0xFFFF_8800_0000_0000 |
| Kernel image | 0xFFFF_FFFF_8000_0000 |
Buses & devices
Buses with real drivers today:
- PCIe via ECAM (
pci-bus) - xHCI USB (
usb-xhci-bus) - PS/2 keyboard + mouse (
ps2-bus) — the current input stack - Serial UART (16550/16450), configured from the ACPI SPCR table
No storage driver exists yet. AHCI / NVMe / IDE are named for reporting only; there is no block-device driver. Persistent storage is future work.
IOMMU
Detection only; enforcement deferred. The ACPI DMAR table is parsed for the
first VT-d DRHD unit and its capabilities are exposed via PlatformInfo
(iommu_present, iommu_base, iommu_version). No DMA-remapping tables are
programmed and no translation is enforced. An IOMMU is therefore not required
and does not currently constrain devices. (system/devices/acpi.zig:96)
What is explicitly NOT supported
- Legacy BIOS / multiboot / limine boot
- 32-bit x86
- x2APIC
- Legacy port-IO (CF8/CFC) PCI configuration
- Non-xHCI USB (UHCI / OHCI / EHCI)
- Machines without ACPI (no device discovery)
- Persistent storage (no AHCI / NVMe / IDE driver yet)
- USB HID input (PS/2 only for now)