====== 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. → [[lyxos:start|Übersicht]] · [[lyxos:syscalls|Syscall-ABI]] · [[lyxos:kernel|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.elf'' vom UEFI SimpleFileSystem lesen - **ELF64 parsen** — ''PT_LOAD''-Segmente mappen, BSS nullen - **UEFI Memory Map** holen, ''ExitBootServices'' aufrufen - **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)'' in ''kernel.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 (''PDE'' mit ''PS''-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 — → [[lyxos:sync|Sync-Primitive]] | | SMP | ''smp.lyx'' | Symmetric Multiprocessing — LAPIC, Trampoline, AP-Startup, Task-API — → [[lyxos:smp|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_*) — → [[lyxos:prozesse|Prozesse & Ring-3]] | | XHCI | ''xhci.lyx'' | USB 3.x-Host-Controller-Treiber — Enumerierung, Datentransfer (WP25) → [[lyxos:xhci|XHCI]] | | RAM-Disk | ''ramdisk.lyx'' | RAM-Disk-Treiber, Disk-IDs 4–7 — Syscalls 153–154 (WP30) → [[lyxos:ramdisk|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) → [[lyxos:iofs|IOFS]] | | Net + TCP | ''net.lyx'' | E1000-Treiber, DHCP, ARP, TCP — Syscalls 180–184 (WP26, WP16-TCP) → [[lyxos:syscalls|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()'' und ''lyx_trigger()'' sind keine echten mmap-Aufrufe — der Bootloader fängt negative Größen als ''vmm_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: [[lyxos:syscalls|Syscall-Referenz]] · Prozess-Lebenszyklus: [[lyxos:prozesse|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: [[lyxos:prozesse|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