Lyx OS – LBF: Lyx Binary Format

Das Lyx Binary Format (LBF) ist das native ausführbare Binärformat von Lyx OS. Es ersetzt ELF/PE für alle Programme die mit lyxc –target=lyxos kompiliert werden, und ist von Grund auf für KI-native Architekturen und das Island & Ocean File System (IOFS) entworfen.

Version: 1.1 · Magic: LYX! (0x4C 0x59 0x58 0x21)

Anwendungen entwickeln · Kernel-Interna · Übersicht


1. Warum ein neues Binärformat?

ELF und PE tragen jahrzehntelangen Ballast: komplexe Relokationstabellen, dynamische Linker, Sektions-Parsing zur Laufzeit — und keinerlei semantische Selbstbeschreibung. LBF bricht damit auf drei Ebenen:

Physisch: LBF ist exakt auf das 4096-Byte-Page-Raster der NVMe-Hardware und der CPU ausgerichtet. Auf nativem IOFS lädt der Kernel keine Segmente in den RAM — er trägt die physischen Sektoradressen (LBAs) direkt in die Page Tables (CR3) ein. Die CPU feuert den Maschinencode ohne eine einzige Kopie.

Semantisch: Block 0 (der Genesis-Block) enthält einen strukturierten KI-Kontext-Pool, der der System-KI vor der ersten Ausführung mitteilt: was das Programm tut, welche Hardware-Erweiterungen es benötigt, welche Abhängigkeiten es deklariert, und ob die kryptografische Vertrauenskette intakt ist.

Dual-Portabel: Auf Legacy-Dateisystemen verhält sich LBF wie eine flache, sequentielle Binärdatei (POSIX-Loader lbf_run). Auf nativem IOFS injiziert der Kernel die 4-KB-Blöcke direkt als Datenknoten in den Graphen. Dasselbe Binary, zwei Lademodi, null Overhead.


2. Zwei Layout-Modi

Modus A — Striktes Alignment (Standard)

Jede logische Sektion (.text, .data, .rodata) beginnt an einer physischen 4096-Byte-Grenze. Optimal für große, monolithische Anwendungen: maximale Page-Table-Mapping-Performance, jeder Block direkt als IOFS-Page importierbar.

Block 0:  Genesis-Block (4096 Bytes)
Block 1:  .text [0]
Block 2:  .text [1]
Block 3:  .rodata [0]   ← neue 4-KB-Grenze, eigene Page
Block 4:  .data [0]     ← neue 4-KB-Grenze, eigene Page

Modus B — Sub-Page Packing (''--lbf-packed'')

Für Kleinstprogramme und Microservices. Sektionen mit identischen Zugriffsrechten werden in dieselbe 4-KB-Page gepackt. Erst wenn sich die Schutzrechte ändern, beginnt ein neuer Block.

Packing-Regel: .text (R/X) und .rodata (R) können in eine gemeinsame Page. .data (R/W) erzwingt immer eine neue 4-KB-Grenze.

Block 0:  Genesis-Block (4096 Bytes)
Block 1:  .text + .rodata zusammen (beide R, ≤ 4032 Bytes)
Block 2:  .data [0]     ← Grenze wegen R/W

Der Compiler setzt lbf_flags |= LBF_FLAGS_PACKED im Genesis-Header. Der Loader (POSIX und IOFS) liest dieses Bit und wendet die korrekten Schutzrechte anhand des Section-Descriptor-TLV (Typ 0x08) pro Sub-Segment an.


3. Genesis-Block: Byte-Layout (4096 Bytes)

Block 0 ist das vollständige Kontrollzentrum: 96-Byte-Header gefolgt von einem 4000-Byte-TLV-Pool.

┌─────────────────────────────────────────────────────────────────┐
│  0x0000–0x000F  Core Machine Header          (16 Bytes)         │
│  0x0010–0x005B  Compiler Provenance Block    (76 Bytes)         │
│  0x005C–0x005F  Layout Flags & KI-Offset     (4 Bytes)          │
├─────────────────────────────────────────────────────────────────┤
│  0x0060–0x0FFF  KI-Semantik-Register / TLV-Pool (4000 Bytes)   │
└─────────────────────────────────────────────────────────────────┘

Vollständige Byte-Tabelle

Offset Größe Typ Feld Beschreibung
0x0000 4 Char[4] magic „LYX!“ (0x4C 0x59 0x58 0x21)
0x0004 1 uint8 format_version LBF-Format-Version: 0x01
0x0005 1 uint8 target_arch 0x01=x86-64, 0x02=ARM64, 0x03=RISC-V
0x0006 2 uint16 os_version Mindest-Kernel-Version (0x0100 = v1.0)
0x0008 8 uint64 entry_point Virtuelle CPU-Startadresse
0x0010 16 uint8[16] compiler_name „lyxc“ + 12 Bytes Padding
0x0020 4 uint32 compiler_version Major«16 | Minor«8 | Patch
0x0024 8 uint64 compiled_at Kompilierzeitpunkt (µs seit Unix-Epoch)
0x002C 16 uint8[16] compiler_instance_sn UUID der Compiler-Instanz (RFC 4122 v4)
0x003C 32 uint8[32] source_sha256 SHA-256 aller .lyx-Eingabedateien (konkateniert)
0x005C 2 uint16 lbf_flags Bit 0: LBF_FLAGS_PACKED; Bits 1–15: Reserviert
0x005E 2 uint16 ki_context_offset Byte-Offset zum TLV-Bereich; Standard: 0x0060
0x0060 4000 uint8[] ki_context TLV-Pool (Typen 0x01–0x0F)

con LBF_FLAGS_PACKED : uint16 := 1

con LBF_ARCH_X86_64  : uint8 := 0x01
con LBF_ARCH_ARM64   : uint8 := 0x02
con LBF_ARCH_RISCV   : uint8 := 0x03

Dateistruktur ab Block 1

Block 0 folgen die Code- und Daten-Blöcke. Jeder Block ist exakt 4096 Bytes, ohne eigenen Block-Header.

BLOCK 0    Genesis-Block
BLOCK 1+   .text [0..N]    R/X — Maschinencode
BLOCK N+1  .rodata [0..]   R   — Konstanten, String-Literale
BLOCK M+1  .data [0..]     R/W — initialisierte globale Variablen
BLOCK K+1  .bss             R/W — Kernel setzt auf 0, kein Inhalt auf Disk

Im Modus B können .text + .rodata in einem gemeinsamen Block stehen; die Aufteilung steht im Section-Descriptor-TLV (Typ 0x08).


4. TLV-Framework (KI-Semantik-Register)

Der 4000-Byte-Pool ab Offset 0x0060 verwendet eine Type-Length-Value-Struktur:

[Type: uint8 (1 Byte)] [Length: uint16 LE (2 Bytes)] [Value: Length Bytes]
Overhead pro Eintrag: 3 Bytes

Reichen 4000 Bytes nicht aus, verweist TLV 0x05 (EXT_META_PTR) auf eine Continuation-IOFS-Page. Das Framework ist damit für beliebig komplexe Programme unbegrenzt erweiterbar.

TLV 0x01 — HUMAN_INTENT

Payload: UTF-8-Freitext, max. 512 Bytes.

Enthält die semantische Beschreibung des Programms. Der Compiler extrahiert ihn aus /‑Doc-Comments über main():

/// Berechnet die CRC32C-Prüfsumme für Speichermedien im IOFS.
/// Liest Eingabe von stdin, gibt Prüfsumme als Hex auf stdout aus.
fn main(): int64 { ... }
Nutzen: * Shell gibt dem User ad-hoc Hilfe ohne Man-Pages * Semantische Firewall prüft Intent gegen angefragte Rechte * IOFS Omni-Ingest indexiert ihn für Timeline-Suche * Lyra kündigt dem User an was das Programm tut, bevor sys_acc_action ausgeführt wird ==== TLV 0x02 — DEP_HASH_GRAPH ==== Payload: Array aus Dependency-Deskriptoren à 52 Bytes. Jeder Eintrag enthält: SHA-256 des Dependency-Quellcodes (32 Bytes), Mindest-Version (4 Bytes) und Kurzname/Alias (16 Bytes). Auf IOFS übersetzt der Dependency-Resolver die SHA-256-Hashes via Hash-Index in LPIDs und webt Graph-Kanten (Gewicht 0xD001) in den Genesis-Knoten — kein Linker-Lauf. ==== TLV 0x03 — SYM_INTERFACE ==== Payload: Array aus kryptografisch verifizierten Funktions-Bindungen. Jeder Eintrag enthält Funktionsname, Parameter-Typen, Rückgabetyp, einen Contract-Hash (SHA-256 der erlaubten Ziel-Insel) und optional den Public Key des erwarteten Signierers. Verhindert Late-Binding-Angriffe: Ein identischer Funktionsname reicht nicht — der Contract-Hash oder Public Key muss übereinstimmen. ==== TLV 0x04 — ISA_EXTENSIONS ==== Payload: uint64 Bitmaske der benötigten CPU-Instruktionserweiterungen.
con LBF_ISA_AVX2    : uint64 := 1    // Intel AVX2 (256-bit SIMD)
con LBF_ISA_AVX512  : uint64 := 2    // Intel AVX-512 (512-bit SIMD)
con LBF_ISA_ARM_NEON: uint64 := 4    // ARM NEON / AdvSIMD
con LBF_ISA_AMX     : uint64 := 8    // Intel AMX (KI-Beschleunigung)
con LBF_ISA_SVE     : uint64 := 16   // ARM SVE/SVE2
con LBF_ISA_RISCV_V : uint64 := 32   // RISC-V Vector Extension
con LBF_ISA_AES_NI  : uint64 := 64   // x86 AES-NI (Hardware-Verschlüsselung)
con LBF_ISA_SHA_NI  : uint64 := 128  // x86 SHA-NI (Hardware-Hashing)
Beim Start gleicht die KI diese Maske gegen die CPUID-Register des Kernels ab. Bei Inkompatibilität wird die Ausführung sicher abgefangen statt einen
SIGILL-Trap zu riskieren. ==== TLV 0x05 — EXT_META_PTR ==== Payload: uint64 LPID (IOFS) oder Block-Index (POSIX). Verweist auf eine Continuation-Page mit weiteren TLV-Daten wenn die 4000 Bytes des Genesis-Blocks erschöpft sind. ==== TLV 0x06 — SOURCE_MAP ==== Payload: Git-Commit-SHA1 (20 Bytes), IOFS-LPID (8 Bytes) oder UTF-8-URI (variabel). Ermöglicht dem Kernel-Tracer, CPU-Register und Maschinencode-Zustände direkt in lesbaren Lyx-Quellcode zurückzuübersetzen. Lyra kann bei Abstürzen die verursachende Quellcode-Zeile direkt benennen. ==== TLV 0x07 — CAPABILITIES ==== Payload: uint64 Bitmaske der benötigten Kernel-Rechte.
con LBF_CAP_FS_READ       : uint64 := 1
con LBF_CAP_FS_WRITE      : uint64 := 2
con LBF_CAP_NET_SOCKET    : uint64 := 4
con LBF_CAP_PROC_SPAWN    : uint64 := 8
con LBF_CAP_KI_EMBED      : uint64 := 16
con LBF_CAP_KI_GRAPH_WRITE: uint64 := 32
con LBF_CAP_SANDBOX_ACCESS: uint64 := 64
con LBF_CAP_AUDIO_MIC     : uint64 := 128
con LBF_CAP_PRIVILEGED    : uint64 := 9223372036854775808   // Bit 63
Der Compiler leitet diese Maske automatisch aus den verwendeten
import-Statements ab (z.B. import std.net.socketLBF_CAP_NET_SOCKET). Die Semantische Firewall prüft: Fordert das Binary Capabilities an die sein deklarierter HUMAN_INTENT nicht rechtfertigt? ==== TLV 0x08 — SECTION_DESCRIPTOR ==== Payload: Array aus Section-Deskriptoren à 8 Bytes. ^ Offset ^ Größe ^ Feld ^ Beschreibung ^ | 0x00 | 2 | block_start | Erster Block-Index dieser Sektion | | 0x02 | 2 | block_count | Anzahl Blöcke (oder Sub-Block-Anteil im Packed-Modus) | | 0x04 | 1 | section_type | 0x01=.text, 0x02=.data, 0x03=.rodata, 0x04=.bss | | 0x05 | 1 | protection | Bitmaske: 0x01=Read, 0x02=Write, 0x04=Execute | | 0x06 | 2 | byte_offset | Im Modus B: Startoffset innerhalb des Blocks (0 im Modus A) | —- ===== 5. Vertrauenskette (5 Schichten) ===== LBF implementiert Supply-Chain-Security durch fünf übereinander liegende Sicherheitsschichten: ^ Schicht ^ Mechanismus ^ Angriff der verhindert wird ^ | 1 — Bit-Rot | SHA-256 über alle Quelldateien (source_sha256) | Stille Bit-Korruption auf Disk | | 2 — Source-Herkunft | source_sha256 bricht wenn Maschinencode geändert wird | Nachträgliche Code-Manipulation | | 3 — Compiler-Vertrauen | Blacklist kompromittierter Compiler-UUIDs in der IOFS Panic-Sandbox | Kompromittierte Build-Toolchain | | 4 — Contract-Linking | TLV 0x03 (SYM_INTERFACE): Contract-Hash oder Public Key muss stimmen | Late-Binding-Angriffe via Namens-Kollision | | 5 — Intent-Kohärenz | Semantische Firewall prüft HUMAN_INTENT gegen CAPABILITIES | Tarnung von Malware als harmlose App | Prüfreihenfolge beim LBF-Import auf IOFS:
1. Genesis-Block lesen; format_version prüfen (== 0x01)
2. Compiler-UUID gegen Blacklist prüfen
3. ISA_EXTENSIONS gegen CPUID des Kernels prüfen
4. Intent + Capabilities auf Kohärenz prüfen (Semantische Firewall)
5. DEP_HASH_GRAPH auflösen → Dependency-LPIDs via Hash-Index
6. SYM_INTERFACE-Contracts verifizieren
7. IOFS-Pages für alle Blöcke anlegen, Graph-Kanten weben
—- ===== 6. Zero-Load auf nativem IOFS ===== Das Herzstück des Formats: auf IOFS wird kein Segment in den RAM kopiert.
1. Kernel liest Genesis-Block (IOFS-Page Typ=0x04)
   → Vertrauenskette durchlaufen
   → ISA_EXTENSIONS gegen CPUID validieren

2. Kernel erstellt neues CR3-Page-Table-Root

3. Section-Descriptor-TLV (0x08) bestimmt VA-Layout:
   .text:   0x0000000000400000 + block_index × 4096
   .rodata: folgt direkt nach .text
   .data:   folgt direkt nach .rodata
   .bss:    kein Block auf Disk — Kernel alloziert zeroed Frames

4. Für jeden Block (Block 1..N):
   lba = lip_get(block_lpid)      → O(1) LIP-Übersetzung
   pte.phys_addr = lba × 4096    → LBA direkt als physische Adresse
   pte.flags     = section.prot  → R/W/X via NX-Bit
   PTE in CR3 schreiben          → kein Kopieren, kein Parsen

5. Stack allozieren (Kernel-Default: 128 KB)

6. CPU springt zu entry_point
   → Alle Pages bereits gemappt — kein erster Page-Fault
   → Kein ELF-Interpreter, kein ld.so, kein Relokations-Loop
Ladezeit: O(n) mit n = Anzahl Blöcke, ausschließlich O(1)-LIP-Lookups und PTE-Schreibvorgänge. Kein Parser, kein Segment-Allokator. —- ===== 7. POSIX-Lademodus ===== Auf Linux, macOS und Windows läuft LBF über den Kompatibilitätslader
lbf_run. Die semantischen Sicherheitsschichten (Semantische Firewall, Graph-Kanten) entfallen; lbf_run ist ein Entwicklungs- und Portabilitätspfad, kein Produktionspfad.
1. Prüfe Magic "LYX!" an Byte 0
2. format_version prüfen (== 0x01)
3. Compiler-UUID gegen ~/.lyx/compiler_blacklist.bin prüfen
4. ISA_EXTENSIONS gegen CPUID prüfen
5. Section-Descriptor-TLV (0x08) auslesen
6. Blöcke 1..N via mmap() mit korrekten Schutzrechten mappen:
   .text:   PROT_READ | PROT_EXEC
   .rodata: PROT_READ
   .data:   PROT_READ | PROT_WRITE
   .bss:    mmap(MAP_ANON) → zeroed
7. DEP_HASH_GRAPH → POSIX-Pfad-Auflösung via LD_LIBRARY_PATH
8. Springe zu entry_point
—- ===== 8. IOFS-Integration ===== Beim Import via
lbf_import legt der Kernel für jeden 4-KB-LBF-Block eine IOFS-Page an: * Block 0 (Genesis): IOFS-Page Typ=0x04 (LBF_Executable), CRC32C über gesamte Page, LPID gesetzt * Blöcke 1..N (Code/Daten): IOFS-Pages Typ=0x02 (Data) Graph-Kanten verbinden die Blöcke und Abhängigkeiten:
con IOFS_EDGE_LBF_CHAIN : int64 := 0xB001   // Genesis → Block 1 → Block 2 → ...
con IOFS_EDGE_LBF_DEP   : int64 := 0xD001   // Genesis → externe Bibliotheks-Genesis
IOFS-Page vs. LBF-Genesis: Beide tragen
LYX! an Byte 0. Die Unterscheidung erfolgt über Byte 0x0004: Wert 0x01 = LBF Genesis-Block (format_version); Wert 0x020xFF = IOFS-Page-Typ. —- ===== 9. Compiler-Flags und CLI =====
# Standard: LBF für LyxOS
lyxc main.lyx --target=lyxos -o main.lbf

# Sub-Page Packing (Modus B)
lyxc main.lyx --target=lyxos --lbf-packed -o main.lbf

# Cross-Compilation
lyxc main.lyx --target=arm64 -o main_arm.lbf

# Mit expliziten ISA-Erweiterungen
lyxc main.lyx --target=lyxos --isa=avx2,amx -o main_avx.lbf

# Debug-LBF (TLV 0x06 zeigt auf lokale .lyx-Dateien)
lyxc main.lyx --target=lyxos --debug -o main.lbf

# Genesis-Block inspizieren
lbf_dump main.lbf

# Nur Vertrauenskette prüfen (Exit-Code 0/1 für CI)
lbf_dump --verify-only main.lbf

# POSIX-Ausführung
lbf_run main.lbf [args...]

# IOFS-Import
lbf_import main.lbf --into-island="tools"
—- ===== 10. Versionierung ===== ^ Version ^ Inhalt ^ | v1.0 | Erster Entwurf: Genesis-Header, TLV-Framework, Zero-Load auf IOFS | | v1.1 | Aktuell. Magic „LYX!“, 96-Byte-Header, Modus A/B,
ISA_EXTENSIONS, SYM_INTERFACE, EXT_META_PTR, SOURCE_MAP, Vertrauenskette auf 5 Schichten | | v1.2 | TLV 0x09: DWARF-kompatibler Unwind-Frame; TLV 0x0A'': Debug-Symboltabelle | | v1.3 | Multi-Arch-Fat-Binaries (x86-64 + ARM64 in einer Datei) | | v2.0 | LAB (Lyx AI Binary): Genesis-Block enthält ausführbares LLM-Gewichts-Fragment | Letzte Aktualisierung: 2026-06-10