Architecture Overview — AeroOS 26R1

Boot Chain

QEMU -kernel AeroOS-26R1-riscv64.elf
    ↓ OpenSBI FW_DYNAMIC firmware
OpenSBI 1.3 → jumps to kernel .text entry (0x80200000)
    ↓
_start.S (riscv64 boot.S)
    ↓ sets up stack, clears BSS, calls C
kernel_start() in main.aero
    ↓
aeroos_uart_puts("AeroOS 26R1 booting...")
scheduler_demo()      # creates T0-T3 S-mode + default userapp
timer_enable()
worker_0() - worker_3()

Memory Layout

0x80000000 ── QEMU virt DRAM start
0x80200000 ── kernel .text entry point
   ...       .rodata / .data / .bss
_kernel_end ── heap start (page allocator)

UART0   = 0x10000000
CLINT   = 0x80080000
PLIC    = 0x0C000000

Scheduler

Preemptive round-robin, dual-track: - Cooperative yield (sys_yield) → fairness - Timer interrupt (0.2s period) → no starvation - 4 S-mode workers + 1 U-mode task created at boot

Context Switch

30-register frame (240 bytes), saved on trap entry:

trap_entry (trap.S)
    → save all caller-saved regs
    → determine trap cause
    → dispatch (timer / ecall / ...)
trap_return
    → restore regs, sret to U-mode or S-mode