====== Lyx OS – Erste Schritte ====== Diese Seite zeigt, wie man Lyx OS baut, in QEMU startet und ein erstes Ring-3-Programm schreibt. Voraussetzung sind Grundkenntnisse in der [[lyx_-_programmiersprache:start|Lyx-Sprache]] und einer Linux-Kommandozeile. → [[lyxos:start|Übersicht]] · [[lyxos:architektur|Architektur]] · [[lyxos:anwendungen|Anwendungen entwickeln]] ---- ===== 1. Voraussetzungen ===== Alle benötigten Tools müssen im ''PATH'' verfügbar sein: # Debian / Ubuntu sudo apt install nasm qemu-system-x86 ovmf gdisk dosfstools mtools # Compiler (muss bereits installiert sein) lyxc --version # erwartet: lyxc version 0.9.3B ^ Tool ^ Zweck ^ | ''nasm'' | UEFI-Bootloader aus boot.asm assemblieren | | ''qemu-system-x86_64'' | LyxOS in einer virtuellen Maschine starten | | ''ovmf'' | UEFI-Firmware für QEMU (OVMF_CODE.fd + OVMF_VARS.fd) | | ''sgdisk'' (gdisk) | GPT-Partitionstabelle auf dem Disk-Image anlegen | | ''mformat, mmd, mcopy'' (mtools) | FAT32-Partition befüllen | | ''lyxc'' | Lyx-Kernel und Ring-3-Programme kompilieren | ---- ===== 2. Repository einrichten ===== git clone https://github.com/lyxos/lyx-os.git # oder eigenes Verzeichnis cd lyx-os Das Repository hat folgende Struktur: lyx-os/ ├── bootloader/ ← NASM-Bootloader (boot.asm), build.sh, run.sh ├── kernel/ ← Kernel-Module in Lyx (.lyx / .lyu) ├── shell/ ← Ring-3-Shell (shell.lyx) ├── examples/ ← Beispielprogramme für LyxOS └── doku/ ← Interne Spezifikationen (syscalls.md, fahrplan.md) ---- ===== 3. Kernel und Disk-Image bauen ===== bash bootloader/build.sh Das Skript führt vier Schritte aus: - Assembliert ''BOOTX64.EFI'' aus ''bootloader/boot.asm'' (NASM, PE32+-Format) - Kompiliert alle Kernel-Module zu ''.lyu''-Units und linkt ''kernel.elf'' - Erstellt ein 128-MB-Disk-Image (''lyx_boot.img'') mit GPT-Partitionstabelle und FAT32-EFI-Partition - Kopiert ''BOOTX64.EFI'' nach ''/EFI/BOOT/'' und ''kernel.elf'' in die Partition Erwartete Ausgabe (gekürzt): [1/4] Assembling bootloader... BOOTX64.EFI 10240 bytes [2/4] Compiling kernel... kernel.elf 98304 bytes [3/4] Building bootable disk image... [4/4] Staging ESP directory... Build complete. Disk image : bootloader/lyx_boot.img Boot with: bash bootloader/run.sh ---- ===== 4. Lyx OS starten ===== bash bootloader/run.sh QEMU startet mit 256 MB RAM, KVM-Beschleunigung und OVMF-Firmware. Kernel-Ausgaben erscheinen direkt im Terminal (COM1 → stdio). ==== Optionen ==== bash bootloader/run.sh --headless # kein Grafikfenster (nur serielle Ausgabe) bash bootloader/run.sh --no-kvm # Software-Emulation ohne KVM (langsamerer, aber überall nutzbar) ==== Erwartete Ausgabe ==== Lyx OS v0.1 - Kernel running PMM: init... free pages: 65432 VMM: identity map + CR3 load... CR3=0x200000 OK Exceptions: IDT loaded (256 gates) SMP: 4 CPUs detected, APs started ATA: disk ready FAT32: init OK VFS: mounted Keyboard: ready Lyx Shell v0.1 - Ring-3 active Exit. Debug-Ausgaben werden zusätzlich nach ''/tmp/lyx_debugcon.txt'' geschrieben. ---- ===== 5. Erstes eigenes Programm ===== Ring-3-Programme werden mit ''lyxc --target=lyxos'' kompiliert. Das Target löst alle Standard-Builtins (''PrintLn'', ''mmap'' usw.) auf LyxOS-Syscalls auf — keine libc-Abhängigkeit. Erstelle ''hello.lyx'': fn main(): int64 { PrintLn("Hallo von Ring-3!"); return 0; } Kompilieren: lyxc --target=lyxos hello.lyx -o hello.elf Das Binary ''hello.elf'' ist ein ELF64-Executable das direkt auf LyxOS läuft. Es verwendet ausschließlich den ''sys_write''- und ''sys_exit''-Syscall — kein Userspace-Linking gegen Bibliotheken. > **Hinweis:** Die Shell in M4 startet ''hello.elf'' noch nicht automatisch. Das vollständige Programm-Laden aus dem Dateisystem ist Teil von M5. Für jetzt: das Binary in ''kernel.elf'' integrieren und beim Systemstart aufrufen. ==== Direkter Syscall aus Lyx ==== Wer Syscalls direkt nutzen möchte, ohne Builtins: // Syscall-Nummern als Konstanten con SYS_WRITE: int64 := 0x0203; con FD_STDOUT: int64 := 1; fn WriteLn(msg: pchar) { // sys_write(fd, buf, len) → rax=Fehler, rdx=bytes var msg_len: int64 := StrLen(msg); // Lyx --target=lyxos mappt sys_write auf das native syscall-Gate var err: int64 := 0; var written: int64 := 0; // Inline-Syscall via Compiler-Builtin (verfügbar ab M5): // (err, written) := syscall(SYS_WRITE, FD_STDOUT, msg, msg_len); } → Vollständige Syscall-Referenz: [[lyxos:syscalls|Syscall-ABI v1.0]] ---- ===== 6. Debugging ===== ==== Serielle Ausgabe ==== ''PrintLn'' und ''PrintStr'' aus Kernel- und Ring-3-Code erscheinen beide auf COM1 → Terminal. Kein separates Debug-Interface nötig. ==== Debug-Konsole ==== ''PrintStr'' an einen speziellen Debug-Port schreibt nach ''/tmp/lyx_debugcon.txt'': tail -f /tmp/lyx_debugcon.txt ==== QEMU Monitor ==== Im laufenden QEMU: ''Ctrl-Alt-2'' wechselt in den QEMU-Monitor. Nützliche Befehle: info mem # aktueller Page-Table-Dump info registers # CPU-Registerstand x/10i $pc # Disassembly ab aktuellem Instruction Pointer Letzte Aktualisierung: 2026-06-09