====== Lyx OS – Systemarchitektur ====== Diese Seite beschreibt den Aufbau von Lyx OS: die Schichten vom UEFI-Boot bis zum Ring-3-Userspace, das Speicherlayout, die Kernel-Module und die Syscall-Grenze. → [[lyxos:start|Übersicht]] · [[lyxos:syscalls|Syscall-ABI]] · [[lyxos:kernel|Kernel-Interna]] ---- ===== 1. Systemschichten ===== ┌─────────────────────────────────────────────────────┐ │ Ring-3 – Userspace │ │ Anwendungen, Shell — kompiliert mit lyxc │ │ Interaktion: ausschließlich via SYSCALL-Instruktion │ ├─────────────────────────────────────────────────────┤ │ Syscall-Gate (Ring-0 / Ring-3 Grenze) │ │ SYSCALL/SYSRET — rax = Syscall-Nr, rdx = Rückgabe │ ├─────────────────────────────────────────────────────┤ │ Ring-0 – Lyx-Kernel (Lyx-Sprache) │ │ PMM · VMM · Exceptions/IDT · SMP · Process │ │ ATA · FAT32 · VFS · Keyboard · Sync │ ├─────────────────────────────────────────────────────┤ │ UEFI-Bootloader (NASM, boot.asm) │ │ PE32+-Binary — BOOTX64.EFI │ ├─────────────────────────────────────────────────────┤ │ UEFI-Firmware (OVMF) / PC-Hardware │ └─────────────────────────────────────────────────────┘ ---- ===== 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) | | '' - 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 11 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-Hierarchie, 2 MB Huge Pages, CR3-Operationen | | Process | ''process.lyx'' | Prozess-Modell: ''ProcCreate'', ''ProcActivate'' | | Sync | ''sync.lyx'' | Synchronisations-Primitive (Mutex, Spinlock) | | SMP | ''smp.lyx'' | Symmetric Multiprocessing — LAPIC, Trampoline-Code, AP-Startup | | ATA | ''ata.lyx'' | ATA-Disk-I/O — Sektorweises Lesen und Schreiben | | FAT32 | ''fat32.lyx'' | Vollständige FAT32-Implementierung (~795 Zeilen) | | VFS | ''vfs.lyx'' | Virtual-Filesystem-Layer — abstrahiert über FAT32 | | Keyboard | ''keyboard.lyx'' | Tastatureingabe (PS/2) | | Kernel | ''kernel.lyx'' | Einstiegspunkt — initialisiert alle Module in der richtigen Reihenfolge | **Initialisierungsreihenfolge** in ''kernel.lyx'': PMM → VMM → Exceptions/IDT → SMP → ATA → FAT32 → VFS → Keyboard → Ring-3-Jump ---- ===== 5. Syscall-Grenze ===== Ring-3-Code kommuniziert mit dem Kernel ausschließlich über die ''SYSCALL''-Instruktion (AMD64 Fast Syscall). Kein UIO, kein ''/proc'', kein ''ioctl''-Polymorphismus. **Register-Layout (kurz):** Eingabe: rax = Syscall-Nummer rdi/rsi/rdx/r10/r8/r9 = Argumente Ausgabe: rax = Fehlercode (0 = OK) rdx = Rückgabewert * Fehler und Rückgabewert kommen in **zwei getrennten Registern** — kein Vorzeichentest, kein globales ''errno''. * ''rcx'' und ''r11'' werden vom SYSCALL-Mechanismus selbst überschrieben und stehen nicht als Argumente zur Verfügung. → Vollständige ABI-Spezifikation: [[lyxos:syscalls|Syscall-Referenz]] ---- ===== 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 mit ''sys_cap_restrict'' 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 | Letzte Aktualisierung: 2026-06-09