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():
sys_acc_action
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 /// 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 { ... }
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.
SIGILL
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 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)
-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.
import
Der Compiler leitet diese Maske automatisch aus den verwendeten 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
-Statements ab (z.B. import std.net.socket → LBF_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:
lbf_run
—-
===== 6. Zero-Load auf nativem IOFS =====
Das Herzstück des Formats: auf IOFS wird kein Segment in den RAM kopiert.
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
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 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
. Die semantischen Sicherheitsschichten (Semantische Firewall, Graph-Kanten) entfallen; lbf_run ist ein Entwicklungs- und Portabilitätspfad, kein Produktionspfad.
lbf_import
—-
===== 8. IOFS-Integration =====
Beim Import via 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
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:
LYX!
IOFS-Page vs. LBF-Genesis: Beide tragen con IOFS_EDGE_LBF_CHAIN : int64 := 0xB001 // Genesis → Block 1 → Block 2 → ...
con IOFS_EDGE_LBF_DEP : int64 := 0xD001 // Genesis → externe Bibliotheks-Genesis
an Byte 0. Die Unterscheidung erfolgt über Byte 0x0004: Wert 0x01 = LBF Genesis-Block (format_version); Wert 0x02–0xFF = IOFS-Page-Typ.
—-
===== 9. Compiler-Flags und CLI =====
ISA_EXTENSIONS
—-
===== 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, # 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"
, 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
