Lyx OS – Systemarchitektur
Diese Seite beschreibt den Aufbau von Lyx OS: die Drei-Domänen-Architektur (TCB / Lyra / User), die Schichten vom UEFI-Boot bis zum Ring-3-Userspace, das Speicherlayout, die Kernel-Module und das Capability-Routing-Gate.
→ Übersicht · Syscall-ABI · Kernel-Interna
1. Systemschichten
┌──────────────────────────────────────────────────────────┐
│ Ring-3 – User-Domäne (eigene CR3, minimale Capabilities)│
│ Anwendungen, Shell — via SysSpawn aus VFS gestartet │
│ Nur erlaubte Syscall-Klassen (PLEDGE_*-Bitmask) │
├──────────────────────────────────────────────────────────┤
│ Ring-3 – Lyra-Domäne (eigene CR3, privilegierter Dienst)│
│ LLM-Inferenz · lyxc-Compiler · Tool-Registry │
│ Schlägt vor / erteilt Capabilities — erzwingt nie │
│ Lyra-KI-Agent (WP17) offen; Vega-Compositor (WP17b) ✅ │
├──────────────────────────────────────────────────────────┤
│ Capability Routing Gate (r3_sc_block-Protokoll) │
│ Nicht-sensible Syscalls: TCB bedient direkt │
│ Capability-erwerbende Syscalls: → Lyra-Mailbox │
├──────────────────────────────────────────────────────────┤
│ Ring-0 – TCB (Trusted Computing Base, Lyx-Sprache) │
│ PMM · VMM · Exceptions/IDT · SMP · Process │
│ ATA · Disk · MBR · FAT32 · VFS · Keyboard │
│ Initrd · Locale · Sync · Ring3 │
│ Deterministisch, WCET-beschränkt — ruft das LLM nie │
├──────────────────────────────────────────────────────────┤
│ UEFI-Bootloader (NASM, boot.asm) │
│ PE32+-Binary — BOOTX64.EFI │
├──────────────────────────────────────────────────────────┤
│ UEFI-Firmware (OVMF) / PC-Hardware │
└──────────────────────────────────────────────────────────┘
Mechanismus und Intelligenz sind strikt getrennt: Der TCB enthält kein LLM und ruft keines auf. Lyra (Ring-3) hält das Modell, der TCB hält die Hardware-Gewalt. Kein kernel/ai.lyx.
2. Boot-Ablauf
Der Bootloader (bootloader/boot.asm, NASM, ~2900 Zeilen) ist ein PE32+-Flat-Binary. UEFI lädt es als BOOTX64.EFI und ruft efi_main(ImageHandle, SystemTable) auf (MS x64 ABI).
Schritte:
- Begrüßung über UEFI
ConOut - Kernel laden —
\\kernel.elfvom UEFI SimpleFileSystem lesen - ELF64 parsen —
PT_LOAD-Segmente mappen, BSS nullen - UEFI Memory Map holen,
ExitBootServicesaufrufen - GDT laden (64-Bit Code 0x08, Data 0x10)
- COM1 initialisieren (0x3F8 — serielle Debug-Ausgabe)
- SYSCALL-MSR (
IA32_LSTAR) auf den Ring-0-Einsprungpunkt setzen - Page Tables aufbauen (Identity-Map 4 GB)
- Bump-Allocator ab physisch 0x2000000 (32 MB) initialisieren
- Sprung in Kernel-Entry (
pub fn main(boot_info_ptr: int64)inkernel.lyx)
3. Speicherlayout
| Adressbereich | Inhalt |
|---|---|
0x0000 – 0x0FFF | Null-Page (unmapped, für nil-Checks) |
0x1000 – 0x1FFFF | Bootloader-Code (PE32+ Text-Section) |
0x100000 – 0x1FFFFF | Bootloader-Heap / Temporäre Strukturen |
0x200000 – ~ | Kernel-ELF (PT_LOAD-Segmente) |
0x2000000 | Bump-Allocator-Basis (Kernel-Heap) |
0x1800000 (24 MB) | SHELL_PHYS_BASE — Ring-3 ELF-Binary (physisch = virtuell mit Identity-Map) |
0x10000000 (256 MB) | USER_HEAP_BASE — virtueller Basis für user_mmap (wächst aufwärts) |
– 4 GB | Identity-Map (1:1 physisch ↔ virtuell) |
0xFFFF800000000000+ | (Zukünftig: höhere Hälfte Kernel-Space) |
Page-Größen:
- Kernel: 2 MB Huge Pages (
PDEmitPS-Bit) für die ersten 4 GB - Userspace (M5+): 4 KB Seiten für granulare Rechteverwaltung
4. Kernel-Module
Der Kernel besteht aus 25 Lyx-Units, die beim Build einzeln zu .lyu vorkompiliert und dann zu kernel.elf zusammengelinkt werden:
| Modul | Datei | Aufgabe |
|---|---|---|
| Exceptions | exceptions.lyx | IDT (256 Gates), CPU-Fault-Routing, panic/assert |
| PMM | pmm.lyx | Physical Memory Manager — Bitmap-basiert, 4 GB, UEFI-Memory-Map als Basis |
| VMM | vmm.lyx | Virtual Memory Manager — PML4, Huge Pages, per-Prozess CR3, User-Page-Mapping |
| Process | process.lyx | Prozess-Modell: ProcCreate, ProcActivate |
| Sync | sync.lyx | Synchronisations-Primitive: Spinlock, Mutex, Semaphor — → Sync-Primitive |
| SMP | smp.lyx | Symmetric Multiprocessing — LAPIC, Trampoline, AP-Startup, Task-API — → SMP & Tasks |
| ATA | ata.lyx | ATA-Disk-I/O — Legacy (Primary Master) und Multi-Disk (4 Kanäle, vmm_op42-44) |
| Disk | disk.lyx | Disk-Abstraktion — probt alle 4 ATA-Kanäle beim Start, cacht Sektorzahl + Modell |
| MBR | mbr.lyx | MBR-Partition-Tabelle — Lesen und Schreiben von Einträgen (Typ 0x0C FAT32 LBA) |
| FAT32 | fat32.lyx | Vollständige FAT32-Implementierung mit LFN-Lesen und LFN-Schreiben |
| VFS | vfs.lyx | Virtual-Filesystem-Layer — FAT32 + Initrd; open/read/write/stat/seek/mkdir/dir/dup |
| Keyboard | keyboard.lyx | Tastatureingabe (PS/2), Tastaturbelegung (Layout-Index via KbdSetLayout) |
| Initrd | initrd.lyx | In-Memory-Ramdisk (Format: LIXR-Magic + Einträge + 4B-Terminator) |
| Locale | locale.lyx | Internationalisierung — 5 Locales, Zahlen-/Zeit-/Datumsformat, LocaleInit liest /config/locale.cfg |
| Ring-3 | ring3.lyx | ELF64-Loader, SysSpawn, Syscall-Handler, Capability Routing Gate (PLEDGE_*) — → Prozesse & Ring-3 |
| XHCI | xhci.lyx | USB 3.x-Host-Controller-Treiber — Enumerierung, Datentransfer (WP25) → XHCI |
| RAM-Disk | ramdisk.lyx | RAM-Disk-Treiber, Disk-IDs 4–7 — Syscalls 153–154 (WP30) → RAM-Disk |
| IOFS-Alloc | iofs_alloc.lyx | Block-Allocator, mkfs, CRC32C, Page-I/O — Syscall 155 (WP01+WP09) |
| IOFS-RW | iofs_rw.lyx | Mount, Read/Write, Checkpoint — Syscalls 156–164 (WP02) |
| IOFS-WAL | iofs_wal.lyx | Write-Ahead-Log — kernel-intern, kein Syscall (WP04) |
| IOFS-Graph | iofs_graph.lyx | Graph-Kanten — Syscalls 165–169 (WP05) |
| IOFS-Traverse | iofs_traverse.lyx | Graph-Traversal BFS/DFS/Reachable/ShortestPath — Syscalls 170–173 (WP06) |
| IOFS-Names | iofs_names.lyx | Named Nodes, Name-Store, GC — Syscalls 174–179 (WP07+GC) → IOFS |
| Net + TCP | net.lyx | E1000-Treiber, DHCP, ARP, TCP — Syscalls 180–184 (WP26, WP16-TCP) → Syscall-ABI |
| Kernel | kernel.lyx | Einstiegspunkt — importiert und initialisiert alle Module |
Initialisierungsreihenfolge in kernel.lyx:
PMM → VMM → RNG-Seed → SMP → VFS (→ Fat32VolumeInit, MbrInit) → DiskInit
→ FAT32-Mount → LocaleInit → Initrd-Mount → SysSpawn (Ring-3 Shell)
→ Keyboard-Poll → Sync-Tests → Scheduler (ProcInit, ProcActivate)
5. Syscall-Grenze
Ring-3-Code kommuniziert mit dem Kernel über einen gemeinsamen Speicherblock (r3_sc_block) und einen dedizierten Trigger-Mechanismus — kein traditionelles SYSCALL-Register-Layout.
r3_sc_block-Protokoll:
// Shared block (physische Adresse wird bei Boot-Start übergeben)
offset 0: nr — Syscall-Nummer (int64)
offset 8: a0 — Argument 0 (int64)
offset 16: a1 — Argument 1 (int64)
offset 24: a2 — Argument 2 (int64)
offset 32: a3 — Argument 3 (int64)
offset 40: result — Rückgabewert (int64), wird vom Kernel geschrieben
// Ablauf aus Ring-3-Sicht:
var sc: int64 := lyx_get_r3sc(); // einmalig: mmap(0,-5,...) → Blockadresse holen
poke64(sc + 0, NR); // Syscall-Nummer schreiben
poke64(sc + 8, arg0); // Argumente schreiben
lyx_trigger(); // mmap(0,-6,...) → Kernel-Handler aufrufen
var result: int64 := peek64(sc + 40);
lyx_get_r3sc()undlyx_trigger()sind keine echten mmap-Aufrufe — der Bootloader fängt negative Größen alsvmm_op-Sentinel ab (op -5 = Block-Adresse holen, op -6 = Trigger).- User-virtuelle Puffer-Adressen (z.B. Lese-Buffer) werden im Kernel via
VmmPhysFromUserVirt(proc_cr3, vaddr)in physische Adressen übersetzt, bevor sie an VFS-Funktionen weitergegeben werden. - Ring-3-FDs sind VFS-FDs + 3 (fd 0 bleibt für stdin/Keyboard reserviert).
→ Implementierung im Kernel: ring3.lyx (handle_r3_syscall) · Vollständige ABI-Spezifikation: Syscall-Referenz · Prozess-Lebenszyklus: Prozesse & Ring-3
6. Capabilities — alles ist ein fd
Lyx OS kennt keine root-Privileg-Eskalation. Jeder fd ist eine Capability: er kodiert sowohl die Ressource als auch die erlaubten Operationen (Lesen, Schreiben, Mappen, Löschen …). Capabilities können nur eingeschränkt, nie erweitert werden.
| Designprinzip | Konsequenz |
|---|---|
| Kein Root | Kein chmod 4755, kein sudo-Äquivalent |
| CLOEXEC by default | Neue fd werden nicht über sys_spawn vererbt — opt-in mit O_INHERIT |
Ein fd-Typ | fd für Dateien, Sockets, Prozesse, AI-Sessions sind konzeptuell gleich |
Alle Pfad-Syscalls nehmen dir_fd | AT_CWD als Default — keine TOCTOU-Lücken durch absolute Pfade |
PLEDGE_*-Bitmask (implementiert in ring3.lyx):
pub con PLEDGE_STDIO: int64 := 1; // stdin/stdout lesen/schreiben
pub con PLEDGE_VFS: int64 := 2; // sys_open, sys_read, sys_write, stat
pub con PLEDGE_EXEC: int64 := 4; // sys_spawn
pub con PLEDGE_BLOCK: int64 := 8; // Raw-Block-Device-Zugriff
pub con PLEDGE_NET: int64 := 16; // Netzwerk-Sockets
pub con PLEDGE_PROC: int64 := 32; // Prozess-Management (kill, nice …)
pub con PLEDGE_ALL: int64 := 63; // alle Capabilities
SysPledge(PLEDGE_STDIO | PLEDGE_VFS); // Capabilities einschränken (irreversibel)
Der Capability Routing Gate in handle_r3_syscall prüft für jede Syscall-Nummer die benötigte Capability-Klasse (syscall_capability_class) gegen die pledge_mask des Prozesses. Verstöße erzeugen ERR_CAPVIOL (Implementierung: WP15).
→ Details: Prozesse & Ring-3
7. Drei-Domänen-Architektur
Lyx OS teilt den Adressraum perspektivisch in drei Domänen auf:
| Domäne | Ring | Beschreibung |
|---|---|---|
| TCB (Trusted Computing Base) | Ring-0 | Kernel: deterministisch, vollständiger Hardware-Zugriff |
| Lyra | Ring-3 privilegiert | KI-Agent + privilegierter Service (geplant: WP17); bekommt PLEDGE_ALL |
| User | Ring-3 minimal | Anwendungen (z.B. Shell) mit eingeschränkten Capabilities via SysPledge |
Heute läuft ausschließlich die Shell als Ring-3-Prozess. Lyra (WP17) ist noch nicht implementiert.
Letzte Aktualisierung: 2026-06-25
