SpaceOS - A custom x86_64 OS with FreeRTOS Kernel and POSIX

This forums is for OS project announcements including project openings, new releases, update notices, test requests, and job openings (both paying and volunteer).
Post Reply
syso
Posts: 1
Joined: Tue Apr 28, 2026 8:15 am

SpaceOS - A custom x86_64 OS with FreeRTOS Kernel and POSIX

Post by syso »

Hey everyone,

I am an embedded systems developer and as a little tryout of LLM-assisted development I have started my own OS.
Because I was familiar with the FreeRTOS SMP Kernel, I've created a port for the x86_64 platform.

I have only used LwIP, ELMs FATFS and FreeRTOS as 3rd party components. All other components are written from scratch.

There is virtio-net, rtl8169, e1000, etc. support, vfat and exfat drivers, Intel GPU 2D, Framebuffer, Audio (AC97), We have full /dev and /proc filesystems, termio and other POSIX APIs which should help to get some open software compiled for it.

I wanted to publish screenshots, but they are too big.

The crazy thing about it is: I was steering it a lot, but the whole OS was done in 2 days.

Here is a bootlog:

Code: Select all

[    0.000000] === SpaceOS booting ===
[    0.000000] [gdt] installing runtime GDT (kernel/user CS+DS, TSS)...
[    0.000000] [tss] installing TSS + IST1/2/3 (#DF / NMI / #MC)...
[    0.000000] [idt] installing 256 vectors (IST-routed for #DF/NMI/#MC)...
[    0.000000] [gdt+tss+idt] done.
[    0.000000] [mb2] info struct @ phys 0x0106a8f0
[    0.000000] [boot] bootloader=GRUB 2.06-13+deb12u1
[    0.000000] [boot] cmdline="console=ttyS0 quiet ramdisk=8M net=dhcp root=sda rootfstype=fatfs rootmnt=/sd"
[    0.000000] [boot] kernel load base = 0x0000000000100000
[    0.000000] [boot] basic mem: lower=639 KiB  upper=1047384 KiB
[    0.000000] [boot] memory map (8 entries):
[    0.000000]         [00] 0x0000000000000000 +0x000000000009fc00  available
[    0.000000]         [01] 0x000000000009fc00 +0x0000000000000400  reserved
[    0.000000]         [02] 0x00000000000f0000 +0x0000000000010000  reserved
[    0.000000]         [03] 0x0000000000100000 +0x000000003fed6000  available
[    0.000000]         [04] 0x000000003ffd6000 +0x000000000002a000  reserved
[    0.000000]         [05] 0x00000000b0000000 +0x0000000010000000  reserved
[    0.000000]         [06] 0x00000000fed1c000 +0x0000000000004000  reserved
[    0.000000]         [07] 0x00000000fffc0000 +0x0000000000040000  reserved
[    0.000000] [boot] total available RAM: 1023 MiB
[    0.000000] [boot] framebuffer: 1024x768 32 bpp pitch=4096 @ 0x00000000fd000000 (type=1)
[    0.000000] [boot] ACPI 1.0 RSDP @ 0x000000000106b270
[    0.000000] [cpu] vendor=GenuineIntel family=0x6 model=0x3c stepping=1
[    0.000000] [cpu] brand: Intel Core Processor (Haswell, no TSX, IBRS)
[    0.000000] [cpu] under hypervisor: TCGTCGTCGTCG
[    0.000000] [cpu] addr bits: phys=40 virt=48
[    0.000000] [cpu] simd: SSE SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 AVX AVX2
[    0.000000] [cpu] sec/perf: NX SMEP RDRAND x2APIC RDTSCP XSAVE CMPXCHG16B FSGSBASE
[    0.000000] [pmm] initialising physical-frame allocator...
[    0.000000] [pmm] bitmap: 131072 bytes @ phys 0x000000000106c000 covering 1048576 frames
[    0.000000] [pmm] frames: 262005 total, 258372 free, 3633 used (1009 MiB free)
[    0.000000] [pmm] alloc test: a=0x0000000000e70000 b=0x0000000000e71000
[    0.000000] [pmm] freed a, realloc'd: c=0x0000000000e70000 (==a? yes)
[    0.000000] [vmm] building runtime page tables (W^X, direct-map, PAT)...
[    0.000000] [vmm] PML4 @ phys 0x0000000000e70000, CR3=0x0000000000e70000
[    0.000000] [vmm] kernel: text [0xffffffff80105000..0xffffffff80164000) RX
[    0.000000] [vmm]         rodata [0xffffffff80164000..0xffffffff80175000) R
[    0.000000] [vmm]         data+bss [0xffffffff80175000..0xffffffff80e6f1c0) RW NX
[    0.000000] [vmm] direct map base = 0xffff800000000000 (covers all RAM in mmap)
[    0.000000] [vmm] kmap (MMIO): next=0xffffe00000000000 end=0xffffe10000000000
[    0.000000] [pmm] bitmap: 131072 bytes @ phys 0x000000000106c000 covering 1048576 frames
[    0.000000] [pmm] frames: 262005 total, 258360 free, 3645 used (1009 MiB free)
[    0.000000] [vmm] direct-map RW smoke ok @ phys 0x0000000000e7c000
[    0.000000] [kheap] initialising slab allocator...
[    0.000000] [kheap] smoke alloc: 16=0xffff800000e7c020 256=0xffff800000e7d100 2k=0xffff800000e7e800 8k=0xffff800000e7f020
[    0.000000] [kheap] live=4 alloc_bytes=14608 free_bytes=0
[    0.000000] [kheap]   class   16: 1 slab(s), 253 free obj(s)
[    0.000000] [kheap]   class  256: 1 slab(s), 14 free obj(s)
[    0.000000] [kheap]   class 2048: 1 slab(s), 0 free obj(s)
[    0.000000] [kheap] live=0 alloc_bytes=14608 free_bytes=14608
[    0.000000] [kheap]   class   16: 1 slab(s), 254 free obj(s)
[    0.000000] [kheap]   class  256: 1 slab(s), 15 free obj(s)
[    0.000000] [kheap]   class 2048: 1 slab(s), 1 free obj(s)
[    0.000000] [kheap] dma_alloc_coherent WB: va=0xffff800000e7f000 pa=0x0000000000e7f000
[    0.000000] [mm] kernel_mm initialised (user VMA window 0x0000000100000000..0x0000700000000000)
[    0.000000] [krandom] seeded (RDRAND)
[    0.000000] [fpu] enabling SSE/AVX + sizing XSAVE area...
[    0.000000] [fpu] XSAVE enabled, XCR0=0x0000000000000007, save area=832 bytes
[    0.000000] [fpu] state: x87 SSE AVX
[    0.000000] [acpi] parsing tables...
[    0.000000] [acpi] LAPIC base = 0x00000000fee00000, 8259-compatible=1
[    0.000000] [acpi] 4 CPU APIC entries (4 present):
[    0.000000]         cpu acpi_id=0 apic_id=0 enabled
[    0.000000]         cpu acpi_id=1 apic_id=1 enabled
[    0.000000]         cpu acpi_id=2 apic_id=2 enabled
[    0.000000]         cpu acpi_id=3 apic_id=3 enabled
[    0.000000] [acpi] 1 I/O APIC(s):
[    0.000000]         id=0 base=0x00000000fec00000 gsi_base=0
[    0.000000] [acpi] 5 IRQ source override(s):
[    0.000000]         ISA IRQ 0 -> GSI 2, active-high, edge
[    0.000000]         ISA IRQ 5 -> GSI 5, active-high, level
[    0.000000]         ISA IRQ 9 -> GSI 9, active-high, level
[    0.000000]         ISA IRQ 10 -> GSI 10, active-high, level
[    0.000000]         ISA IRQ 11 -> GSI 11, active-high, level
[    0.000000] [acpi] 1 PCIe ECAM segment(s):
[    0.000000]         seg 0: base=0x00000000b0000000 buses 0..255
[    0.000000] [acpi] HPET id=0 base=0x00000000fed00000 min_tick=0
[    0.000000] [apic] masking 8259 PIC + bringing up LAPIC + I/O APIC...
[    0.000000] [8259] remapped to 0x20..0x2f and fully masked
[    0.000000] [lapic] BSP id=0, MMIO @ 0xffffe00000000000 (phys 0x00000000fee00000), enabled, TPR=0, SVR=0x1ff, LVT timer masked, ESR cleared
[    0.000000] [ioapic] id=0 @ 0xffffe00000001000 (phys 0x00000000fec00000) gsi=0..23 (24 entries) all masked
[    0.000000] [irq] alloc vector 0x30 for uart-com1
[    0.000000] [serial] COM1 now IRQ-driven (vector wired via I/O APIC)
[    0.000000] [fb] display0: 1024x768@32bpp pitch=4096 VA=0xffffe00000002000 phys=0x00000000fd000000 (WC)
[    0.000000] [fbcon] title + status bar wired to display0 (1024x768)
[    0.000000] [per_cpu] BSP installed: cpu_id=0 apic_id=0 GS_BASE=0xffffffff805b6a40
[    0.000000] [syscall] LSTAR=0xffffffff8010708c STAR=0x0010000800000000 FMASK=0x44700 (SCE on)
[    0.000029] [hpet] enabled @ phys 0x00000000fed00000; period=10000000 fs (~100 MHz)
[    0.044983] [smp] MADT: 4 enabled CPU(s); SPACEOS_CORES cap = 4
[    0.093444] [smp] starting APIC 1 as logical cpu 1 (stack top 0xffff800000e87020)
[    0.146734] [smp] -> INIT
[    0.169954] [smp] -> wait 10ms
[    0.207000] [smp] -> SIPI #1 vec=0x08
[    0.241854] [smp] -> SIPI #2
[    0.241939] [syscall] LSTAR=0xffffffff8010708c STAR=0x0010000800000000 FMASK=0x44700 (SCE on)
[    0.269135] [smp] -> polling booted_flag
[    0.318090] [smp] AP 1 online: apic_id=1 (this_cpu()->cpu_id=1)
[    0.405738] [smp] starting APIC 2 as logical cpu 2 (stack top 0xffff800000e8c020)
[    0.461967] [smp] -> INIT
[    0.486156] [smp] -> wait 10ms
[    0.524722] [smp] -> SIPI #1 vec=0x08
[    0.562393] [syscall] LSTAR=0xffffffff8010708c STAR=0x0010000800000000 FMASK=0x44700 (SCE on)
[    0.562552] [smp] -> SIPI #2
[    0.617322] [smp] AP 2 online: apic_id=2 (this_cpu()->cpu_id=2)
[    0.647888] [smp] -> polling booted_flag
[    0.749432] [smp] starting APIC 3 as logical cpu 3 (stack top 0xffff800000e91020)
[    0.812611] [smp] -> INIT
[    0.839716] [smp] -> wait 10ms
[    0.881557] [smp] -> SIPI #1 vec=0x08
[    0.922364] [syscall] LSTAR=0xffffffff8010708c STAR=0x0010000800000000 FMASK=0x44700 (SCE on)
[    0.922517] [smp] -> SIPI #2
[    0.979861] [smp] AP 3 online: apic_id=3 (this_cpu()->cpu_id=3)
[    1.012548] [smp] -> polling booted_flag
[    1.120447] [smp] bringup complete: 4 CPU(s) online

[    1.169518] === Foundation complete. Starting FreeRTOS scheduler. ===
[    1.231074] [pktpool] 4096 entries x 2336 bytes = 9 MiB at va=0xffff80000108c000 pa=0x108c000
[    1.309664] [pci] enumerating PCIe...
[    1.374254] [pci] segment 0: ECAM phys 0x00000000b0000000 -> kmap 0xffffe00000304000 (buses 0..255, 256 MiB window)
[    1.377334] [netdev] eth0 registered: MAC=52:54:00:00:00:01 MTU=1500  features=0x00000002
[    1.377643] [irq] alloc vector 0x31 for e1000
[    1.377798] [pci-msi] e1000 -> vector 0x31 (addr64=1) on dev pci 0000:00:04.0
[    1.378227] [e1000] eth0: initial link UP (status=0x00080283, 1000 Mb/s)
[    1.378348] [e1000] pci 0000:00:04.0: bound, MAC=52:54:00:00:00:01  MMIO=0xffffe00010304000  vector=0x31  RX/TX rings=512  netdev=eth0
[    1.378429] [dev] bound pci 0000:00:04.0 -> e1000
[    1.379059] [virtio-net] pci 0000:00:05.0: caps mapped (common=0xffffe0001032d000 notify=0xffffe00010327000 mul=4 isr=0xffffe0001032c000 dev_cfg=0xffffe0001032a000)
[    1.379351] [virtio-net] pci 0000:00:05.0: MAC=52:54:00:00:00:03  features=0x100010020 (offered 0x10130ff8024)
[    1.379546] [irq] alloc vector 0x32 for vnet-rx
[    1.379613] [pci-msix] pci 0000:00:05.0 slot 0 -> vector 0x32 (vnet-rx)
[    1.379656] [irq] alloc vector 0x33 for vnet-tx
[    1.379714] [pci-msix] pci 0000:00:05.0 slot 1 -> vector 0x33 (vnet-tx)
[    1.379810] [pci-msix] pci 0000:00:05.0: 2/10 vectors enabled (BAR1 tbl_off=0x0)
[    1.380493] [netdev] eth1 registered: MAC=52:54:00:00:00:03 MTU=1500  features=0x00000000
[    1.381078] [virtio-net] pci 0000:00:05.0: bound, MSI-X rx=0x32 tx=0x33  netdev=eth1  queues: rx=256 tx=256
[    1.381137] [dev] bound pci 0000:00:05.0 -> virtio-net
[    1.381355] [dev] 12 device(s) registered:
[    1.381417]         pci 0000:00:1f.3 [8086:2930] class=0c.05.00 (serial-bus) (unbound)
[    1.381481]         pci 0000:00:1f.2 [8086:2922] class=01.06.01 (storage) (unbound)
[    1.381523]         pci 0000:00:1f.0 [8086:2918] class=06.01.00 (bridge) (unbound)
[    1.381583]         pci 0000:00:08.0 [1af4:1005] class=00.ff.00 (unclassified) (unbound)
[    1.381642]         pci 0000:00:07.0 [8086:2668] class=04.03.00 (multimedia) (unbound)
[    1.381688]         pci 0000:00:06.0 [1b36:000d] class=0c.03.30 (serial-bus) (unbound)
[    1.381745]         pci 0000:00:05.0 [1af4:1000] class=02.00.00 (network) -> virtio-net
[    1.381780]         pci 0000:00:04.0 [8086:10d3] class=02.00.00 (network) -> e1000
[    1.381858]         pci 0000:00:03.0 [1b36:0010] class=01.08.02 (storage) (unbound)
[    1.381907]         pci 0000:00:02.0 [8086:2922] class=01.06.01 (storage) (unbound)
[    1.381987]         pci 0000:00:01.0 [1234:1111] class=03.00.00 (display) (unbound)
[    1.382032]         pci 0000:00:00.0 [8086:29c0] class=06.00.00 (bridge) (unbound)
[    1.382735] [init] starting scheduler...
[    1.383302] [port] IDT vectors installed: yield 0xFD -> 0xffffffff80107155, tick 0xF0 -> 0xffffffff8010725d, yield-IPI 0xFB -> 0xffffffff801071c0
[    1.383438] [port] probe int 0xFC: tick_count 0 -> 1 (handler RAN)
[    1.393517] [lapic] timer: bus ~1005 MHz, divide-16 -> 62868700 Hz, tick @ 1000 Hz (reload=62868)
[    1.393521] [lapic] timer: bus ~1005 MHz, divide-16 -> 62825000 Hz, tick @ 1000 Hz (reload=62825)
[    1.393522] [lapic] timer: bus ~1008 MHz, divide-16 -> 63031200 Hz, tick @ 1000 Hz (reload=63031)
[    1.393561] [lapic] timer: bus ~1004 MHz, divide-16 -> 62750000 Hz, tick @ 1000 Hz (reload=62750)
[    1.393716] [lapic] post-arm LVT=0x000200f0 CUR(t=0)=55868 CUR(t=100us)=47493 [decrementing]
[    1.393722] [lapic] post-arm LVT=0x000200f0 CUR(t=0)=58781 CUR(t=100us)=50344 [decrementing]
[    1.393742] [port] AP 2 entering SMP scheduler (idle TCB=0xffffffff8017a190)
[    1.393749] [port] AP 1 entering SMP scheduler (idle TCB=0xffffffff8017a0a0)
[    1.393724] [lapic] post-arm LVT=0x000200f0 CUR(t=0)=58200 CUR(t=100us)=49575 [decrementing]
[    1.393762] [lapic] post-arm LVT=0x000200f0 CUR(t=0)=56500 CUR(t=100us)=50188 [decrementing]
[    1.393782] [port] AP 3 entering SMP scheduler (idle TCB=0xffffffff8017a280)
[    1.394040] [heartbeat] #0  uptime=0.001 s
[    1.394715] [ahci] pci 0000:00:1f.2: VS=0x00010000 CAP=0xc0141f05 CAP2=0x00000000 NCS=32 S64A=1
[    1.395098] [ahci] pci 0000:00:1f.2: ports implemented = 0x0000003f
[    1.395138] [irq] alloc vector 0x34 for ahci
[    1.395311] [pci-msi] ahci -> vector 0x34 (addr64=1) on dev pci 0000:00:1f.2
[    1.781862] [ahci] port 2: non-SATA signature 0xeb140101 — skipping
[    1.978088] [ahci] pci 0000:00:1f.2: bound, 0 port(s) with disks, vector=0x34
[    1.978147] [dev] bound pci 0000:00:1f.2 -> ahci
[    1.978299] [ahci] pci 0000:00:02.0: VS=0x00010000 CAP=0xc0141f05 CAP2=0x00000000 NCS=32 S64A=1
[    1.978347] [ahci] pci 0000:00:02.0: ports implemented = 0x0000003f
[    1.978376] [irq] alloc vector 0x35 for ahci
[    1.978406] [pci-msi] ahci -> vector 0x35 (addr64=1) on dev pci 0000:00:02.0
[    2.235911] [blkdev] sda registered: 131072 sectors x 512 B = 64 MiB  model='QEMU HARDDISK'
[    2.235950] [ahci] port 0: SATA disk, 131072 sectors x 512 B = 64 MiB, model='QEMU HARDDISK'
[    2.236385] [blkdev] sda1 registered: 131009 sectors x 512 B = 63 MiB  model='QEMU HARDDISK pt1'
[    2.236417] [part] sda1 = sda+63 (type=0x06, 131009 sectors)
[    2.549994] [ahci] pci 0000:00:02.0: bound, 1 port(s) with disks, vector=0x35
[    2.550037] [dev] bound pci 0000:00:02.0 -> ahci
[    2.550283] [nvme] pci 0000:00:03.0: VS=1.4.0 CAP=0x004008200f0107ff DSTRD=0 MQES=2047 TO=7500ms
[    2.550730] [dev] pci 0000:00:03.0: INTx pin A -> GSI 11 (PCI_INTERRUPT_LINE=0x0b, swizzle would say 19)
[    2.550763] [irq] alloc vector 0x36 for nvme
[    2.550814] [dev] pci 0000:00:03.0: bound to vector 0x36 via INTx pin A -> GSI 11
[    2.552943] [blkdev] nvme0n1 registered: 131072 sectors x 512 B = 64 MiB  model='QEMU NVMe Ctrl'
[    2.552990] [nvme] pci 0000:00:03.0: bound nvme0n1 — 'QEMU NVMe Ctrl' SN='spaceos-nvme0' FW='10.2.2' 131072 sectors x 512 B = 64 MiB, vec=0x36
[    2.553289] [dev] bound pci 0000:00:03.0 -> nvme
[    2.553660] [fbdev] /dev/fb0 -> display0 (1024x768@32bpp)
[    2.554094] [rtc] 2026-04-28 14:17:59 (CMOS)
[    2.554244] [initd] starting target=default (12 service(s) registered)
[    2.554323] [initd] starting watchdog...
[    2.554950] [watchdog] 4 per-CPU ticker(s) + monitor up
[    2.554995] [initd] start watchdog -> running
[    2.555025] [initd] starting tty...
[    2.555197] [tty] /dev/tty0 registered
[    2.555256] [tty] /dev/ttyS0 registered
[    2.555281] [tty] /dev/tty0 (fbcon+UART) + /dev/ttyS0 (UART) wired; tty0 = default
[    2.555307] [initd] start tty -> done (one-shot)
[    2.555329] [initd] starting ramdisk...
[    2.583038] [blkdev] ram0 registered: 16384 sectors x 512 B = 8 MiB  model='SpaceOS RAM disk'
[    2.583078] [initd] start ramdisk -> done (one-shot)
[    2.583132] [initd] starting devfs...
[    2.583445] [vfs] mounted /dev on ram0 (fs=devfs, slot=0)
[    2.583476] [initd] start devfs -> done (one-shot)
[    2.583485] [initd] starting procfs...
[    2.583528] [vfs] mounted /proc on ram0 (fs=procfs, slot=1)
[    2.583543] [initd] start p
rocfs -> done (one-shot)
[    2.583552] [initd] starting rootfs...
[    2.586673] [vfs] mounted /sd on sda (fs=fatfs, slot=2)
[    2.586709] [rootfs] mount=== posixtest start ===ed sda on /sd (fs=fatfs)
[    2.586738] [initd] start rootfs -> done (one-shot)
[    2.586847] [initd] starting etc-init...
[    2.588708] [etc] /sd/etc up-to-date
[
 2.589658] [etc] hostname="spaceos"
[    2.589675] [initd] start etc-init -> done (one-shot)
[    2.589685] [initd] starting lwip...
[    2.590702] [lwip] tcpip[posixtest] threads + mutex + join_thread up; attaching netifs
[    2.590895] [lwip] boot policy: net=dhcp (DHCP on every netif)
[    2.592721] [lwip] eth1: mdns hostname spaceos.local + _http._tcp on :80
[    2.592748] [lwip]

 eth1: 0.0.0.0 — waiting for DHCP
[    2.593465] [lwip] eth1: DHCP started
[    2.593676] [lwip] eth0: mdns hostname spaceos-1.local + _http._tcp on :80



If anyone is interested, I can publish it.
Post Reply