universalisos/kernel
Fábio Coutada 9540b0528c feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel
Phase B (Core Device Support) — all drivers verified in QEMU:
- Network: virtio-net cleanup, RTL8139, E1000, clause-22 MDIO PHY management,
  CAN bus, industrial protocols (Modbus/Profibus/EtherCAT), controller probe+dispatch
- Block storage: RAM disk backend (write->read->verify PASSED), virtio-blk transport,
  backend dispatch, real MBR+GPT partition parsers, SD/eMMC command framework
- GPIO: PL061 (verified), I2C: DesignWare (verified), SPI: PL022 (verified)

Phase C (Advanced Features):
- PCI: FULL PikeOS ARMv7 replica — transport-agnostic uos_pci_ops, config-address
  encoding, BAR sizing, capability walk, enumeration+bridge recursion, MSI/MSI-X
- USB: PikeOS-style layered stack — usb.h contract, usb_core.cpp (enumeration
  state machine), usb_ehci.cpp (EHCI transport)
- Display: FULL 1:1 PikeOS fbcon replica + copied font_8x16

Build foundation fixes:
- Freestanding aeabi_runtime.cpp (__aeabi_uidiv/__aeabi_uldivmod)
- PikeOS-style flat 4GB MMU section map + proper enable (unblocked device MMIO)
- guest.h MAX_GUEST_IMAGE_SIZE 256MB->16MB (BSS was 259MB)
- C/C++ linkage fixes, duplicate-virtio_net_init, MMIO access-size handling

Phase D (PikeOS ARMv7 Microkernel Port):
- D-1: Per-VM address spaces — cloned pgdirs, ASID-tagged TLB, 4K page walker,
  isolation PASSED (two guests, same VA->different PAs), guest fault recovery
- D-2: IRQ dispatch backbone — 1024-slot dispatch table, real GICv2 hardware
  (GICD_CTLR/GICC_CTLR/GICC_PMR/GICC_IAR/GICC_EOIR), arm_irq_handler wired
- D-3: Time subsystem — CNTVCT ns-since-boot, CNTP periodic ticker via D-2
- D-4: KDEV framework — linker-section driver registration, uos_kdev_init_all,
  name lookup
- D-5: VFP/NEON — lazy enable (undef trap->CPACR+FPEXC.EN), FPEXC=0x40000000
- D-6: SMP — per-CPU state, MPIDR, IPI/SGI framework (reschedule+TLB flush)

All uos_ naming (PikeOS p4_ convention adapted). Compiles -Werror freestanding C++17.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-09 09:10:53 +01:00
..
arch feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
drivers feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
include/universalisos feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
src feat(phase-a): complete PikeOS 5.0 context switching implementation 2026-07-07 23:44:30 +01:00
device.cpp feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
device.h feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
gic.cpp feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
gic.h feat(phase-a): complete PikeOS 5.0 context switching implementation 2026-07-07 23:44:30 +01:00
guest.cpp feat(phase-a): complete PikeOS 5.0 context switching implementation 2026-07-07 23:44:30 +01:00
guest.h feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
kernel.cpp feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
linker.ld feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
Makefile feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
mm.cpp feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
mm.h feat(phase-a): complete PikeOS 5.0 context switching implementation 2026-07-07 23:44:30 +01:00
partition.cpp feat(phase-a): complete PikeOS 5.0 context switching implementation 2026-07-07 23:44:30 +01:00
partition.h feat(phase-a): complete PikeOS 5.0 context switching implementation 2026-07-07 23:44:30 +01:00
README.md feat(phase-a): complete PikeOS 5.0 context switching implementation 2026-07-07 23:44:30 +01:00
scheduler.cpp feat(phase-a): complete PikeOS 5.0 context switching implementation 2026-07-07 23:44:30 +01:00
scheduler.h feat(phase-a): complete PikeOS 5.0 context switching implementation 2026-07-07 23:44:30 +01:00
uos_fpu.cpp feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
uos_fpu.h feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
uos_int.cpp feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
uos_int.h feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
uos_kdev.cpp feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
uos_kdev.h feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
uos_smp.cpp feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
uos_smp.h feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
uos_time.cpp feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
uos_time.h feat(universalisos): PikeOS-style Phase B/C device drivers + Phase D microkernel 2026-07-09 09:10:53 +01:00
vm.cpp feat(phase-a): complete PikeOS 5.0 context switching implementation 2026-07-07 23:44:30 +01:00
vm.h feat(phase-a): complete PikeOS 5.0 context switching implementation 2026-07-07 23:44:30 +01:00

Universalisos Kernel — Stage 1 Bare-Metal Skeleton (C++)

This is the first bootable type-1 hypervisor milestone for Universalisos: a minimal bare-metal kernel written in C++ that runs on QEMU's ARM virt machine and prints to the PL011 UART.

Status: Stage 1 COMPLETE — Bare-metal C++ skeleton operational Overall Progress: ~15-20% of PikeOS 5.0 functionality (framework foundations) Next Milestone: Stage 2 — Exception handling and system calls (6-8 weeks)

Building

Requires arm-none-eabi-gcc and qemu-system-arm.

cd kernel
make

Outputs:

  • kernel.elf — ELF image for debugging
  • kernel.bin — raw binary for QEMU -kernel

Running in QEMU

make run

This runs qemu-system-arm with the ELF image so that QEMU loads the kernel at the address specified in the linker script.

Expected output:

Universalisos type-1 hypervisor booted.
Stage 1: bare-metal C++ skeleton running on QEMU ARM virt.

Press Ctrl+A then X to exit QEMU.

Inspecting the binary

make dump

Layout

File Purpose
arch/arm/boot.S Assembly entry point, stack/BSS setup
arch/arm/linker.ld Memory layout for QEMU virt (load at 0x40000000)
arch/arm/uart.cpp PL011 UART driver
arch/arm/uart.h UART interface
kernel.cpp kernel_main() entry point
Makefile Build configuration with AUTOSAR C++ flags

Development Stages

Universalisos progresses through defined stages toward PikeOS 5.0 compatibility:

Stage 1: Bare-Metal C++ Skeleton (CURRENT)

  • ARMv7 boot sequence and exception vectors
  • PL011 UART driver for debugging output
  • Basic C++ runtime environment
  • Identity-mapped memory with MMU
  • Status: COMPLETE
  • Implementation: 5% of PikeOS functionality

🔄 Stage 2: Exception Handling & System Calls (Next)

  • Enhanced exception handlers (data abort, prefetch abort)
  • SVC-based system call framework
  • Priority-based scheduler foundation
  • Task creation and lifecycle management
  • Timeline: 6-8 weeks
  • Target Implementation: 10-15% of PikeOS functionality

📋 Stage 3: Memory Management & Context Switching

  • ARMv7 MMU with proper page tables
  • TLB management and invalidation
  • VM context switching implementation
  • Memory protection and domains
  • Timeline: 8-12 weeks
  • Target Implementation: 20-25% of PikeOS functionality

📋 Stage 4: Interrupt Handling & Device Virtualization

  • ARMv7 GIC interrupt controller
  • Virtual interrupt injection to VMs
  • Device framework and MMIO emulation
  • Basic device drivers (UART, Timer)
  • Timeline: 12-16 weeks
  • Target Implementation: 30-35% of PikeOS functionality

📋 Stage 5: Guest OS Boot & I/O Virtualization

  • Guest OS boot protocol framework
  • I/O request handling and routing
  • Basic virtio device emulation
  • Simple guest OS (bare-metal apps)
  • Timeline: 16-20 weeks
  • Target Implementation: 40-45% of PikeOS functionality

Technical Specifications

ARMv7 Architecture Compliance

  • Exception Levels: PL1 (Privileged) for hypervisor mode
  • Page Table Format: Long descriptor (4 KiB pages, 3-level translation)
  • Exception Vectors: 16-byte aligned vector table at 0x00000000
  • System Calls: SVC instruction with immediate parameter encoding

Memory Management

  • Virtual Address Space: 32-bit (4 GiB theoretical, 512 MiB identity-mapped)
  • Physical Memory: QEMU virt machine with 1 GiB RAM
  • Page Size: 4 KiB standard pages
  • Memory Domains: 16 ARMv7 memory domains for isolation

UART Configuration

  • Device: ARM PL011 UART
  • Base Address: 0x09000000 (QEMU virt platform)
  • Baud Rate: 115200 (default QEMU setting)
  • Features: TX/RX FIFOs, interrupt support (Stage 4)

Safety-Critical Compliance

  • C++ Standard: C++17 with AUTOSAR compliance
  • Coding Guidelines: MISRA C++ 2023 enforcement
  • Safety Levels: ASIL-QM through ASIL-D framework
  • Memory Safety: No dynamic allocation, compile-time verification

Build System

Compiler Configuration

arm-none-eabi-g++ \
  -march=armv7-a \
  -mtune=cortex-a15 \
  -mfpu=neon-vfpv4 \
  -mfloat-abi=hard \
  -ffreestanding \
  -nostdlib \
  -fno-exceptions \
  -fno-rtti \
  -fno-threadsafe-statics \
  -fno-use-cxa-atexit \
  -Werror

AUTOSAR C++ Flags

  • MISRA C++: Enabled via compiler warnings
  • Static Analysis: Compile-time verification
  • Runtime Safety: No exceptions, no RTTI
  • Memory Safety: Static allocation only

Linker Script Features

  • Section Layout: .text, .rodata, .data, .bss, .stack
  • Alignment: 16-byte alignment for exception vectors
  • Symbol Export: kernel_start, kernel_end for debugging
  • Load Address: 0x40000000 (QEMU virt RAM base)

Debugging

Serial Console Output

# Monitor UART output in QEMU
make run

# Expected output:
# Universalisos type-1 hypervisor booted.
# Stage 1: bare-metal C++ skeleton running on QEMU ARM virt.

Binary Inspection

# Check ELF sections and symbols
arm-none-eabi-readelf -h kernel.elf

# Disassemble the kernel
arm-none-eabi-objdump -d kernel.elf > kernel.disasm

# Examine the raw binary
hexdump -C kernel.bin | head -20

QEMU Debugging

# Run QEMU with GDB server
qemu-system-arm -M virt -m 1G \
  -kernel kernel.elf -nographic \
  -serial mon:stdio -s -S

# Connect with GDB in another terminal
arm-none-eabi-gdb kernel.elf
(gdb) target remote localhost:1234
(gdb) break kernel_main
(gdb) continue

Platform Information

QEMU ARM Virt Machine

  • CPU: ARM Cortex-A15 (v7-A)
  • RAM: 1 GiB (configurable)
  • Boot Method: Direct kernel loading
  • Serial: PL011 UART at 0x09000000
  • Interrupt Controller: ARM GIC at 0x08000000
  • Timer: ARMv7 generic timer

Device Tree

While Stage 1 doesn't use device tree, future stages will:

  • Stage 3: Memory layout from DTB
  • Stage 4: Device discovery from DTB
  • Stage 5: Guest OS DTB generation

Performance Characteristics

Current Stage 1 Metrics

  • Boot Time: <100ms to UART output
  • Memory Footprint: ~64 KiB kernel image
  • Interrupt Latency: N/A (interrupts disabled)
  • Context Switch Time: N/A (no context switching)

Expected Stage 2-5 Targets

  • Interrupt Latency: <10μs (Stage 4)
  • Context Switch Time: <50μs (Stage 3)
  • Scheduler Overhead: <5% CPU time (Stage 2)
  • Guest Boot Time: <500ms for minimal Linux (Stage 5)

Integration Points

Universalisos Ecosystem

  • Aurelio: Cyber-physical brain platform integration
  • nervura-electrica: Infrastructure and hosting support
  • replica-omnisciente: Agent orchestration foundation

PikeOS Codebase Integration

  • Source Reference: PikeOS 5.0 source code in ../src/
  • Documentation: Complete PikeOS manuals in ../docs/
  • XSD Schemas: Configuration schemas in ../xsd/
  • Build Tools: Eclipse IDE sources in ../ide/

Design notes

Memory Layout

  • The kernel is loaded by QEMU at RAM base 0x40000000.
  • A 64 KiB stack is reserved immediately after the BSS section.
  • Total memory identity-mapped: 512 MiB for QEMU virt machine.
  • Page tables use ARMv7 long descriptor format (4 KiB pages).

Boot Process

  1. Boot.S entry point sets up VBAR, stacks, and clears BSS
  2. C++ runtime initialization (constructors for global objects)
  3. UART driver initialization (PL01 UART at 0x09000000)
  4. kernel_main() entry point prints status message and halts

ARMv7-Specific Implementation

  • Exception Level: Runs at PL1 (Privileged Level 1)
  • MMU Configuration: Identity-mapped page tables for simplicity
  • Interrupts: Disabled in boot stub, uses wfi for idle
  • System Calls: SVC-based syscall framework (Stage 2)

Relationship to PikeOS Architecture

This Stage 1 implementation follows PikeOS hypervisor patterns:

  • Type-1 Hypervisor Design: Direct hardware access, no host OS
  • ARM Architecture Support: Native ARMv7 implementation
  • Safety-Critical Foundation: MISRA C++ compliant structure
  • Virtualization Framework: VM structures and lifecycle management

Current Implementation: Framework foundations matching PikeOS architecture patterns Remaining Work: Complete virtualization features, device drivers, guest OS support

See ../UNIVERSALISOS_VS_PIKEOS_5.0.md for detailed comparison analysis.