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)
LBF ist das ausführbare Binärformat von Lyx OS. Anders als ELF oder PE wird ein LBF-Binary auf nativem IOFS ohne eine einzige Speicher-Kopie ausgeführt — der Kernel trägt die physischen Disk-Adressen direkt in die CPU-Seitentabelle ein. Block 0 (Genesis-Block) enthält zusätzlich einen strukturierten KI-Kontext, der dem Betriebssystem vor der ersten Ausführung mitteilt was das Programm tut und welche Rechte es benötigt.
→ Anwendungen entwickeln · Kernel-Interna · Übersicht
0. Implementierungsstand (nachgemessen 2026-08-27 mit lyxc 1.1.11B)
Zwei Emit-Modi — NICHT verwechseln:
| Flag-Kombination | Erzeugtes Format | Magic | Zweck |
|---|---|---|---|
lyxc prog.lyx --target=lyxos | Natives LYX! (x86-64-Maschinencode) | LYX! (0x4C595821) | Produktiv — läuft auf Lyx OS |
lyxc prog.lyx --target=lyxos --emit=lbf | IR-Bytecode LBF\0 | LBF\0 (0x4C424600) | Simulation/Test — kein nativer Code |
Der Rest dieser Seite beschreibt das native LYX!-Format (Produktionspfad).
Was heute trägt
--target=lyxoserzeugt nativen x86-64-Maschinencode im LYX!-Format;lyxcübersetzt sich selbst dorthin.- Mehrere Sektionen sind umgesetzt — Compiler und Kernel. Der Compiler legt je Sektion einen
SECTION_MAP-Eintrag im Genesis-Block ab, der Loader (kernel/lbf_exec.lyx) liest ihn und trennt.text,.rodataund.databeim Einhängen. - W^X ist umgesetzt, konservativ: der Loader führt eine Schreibbarkeitskarte über alle Seiten des Abbilds. Weil die Nutzlast eines Blocks 4032 Byte lang ist und damit nicht auf Seitengrenzen fällt, kann eine Seite Bytes aus zwei Sektionen enthalten — deshalb gilt: eine Seite ist beschreibbar, sobald irgendein Byte darin zu einer beschreibbaren Sektion gehört. Nur Seiten, die vollständig von Nur-Lese-Sektionen gedeckt sind, werden schreibgeschützt eingehängt (
PTE_P_UstattPTE_P_W_U). .bsswird vom Kernel genullt (Sektionstyp 4, keine Daten in der Datei).- Rechte kommen aus dem Manifest. Die
CAPABILITIES-TLV wird beim Laden auf diePLEDGE-Bits des Kernels abgebildet; ein LBF ohne Angabe bekommt nurPLEDGE_STDIO— fail-closed. - VA-Layout: Nutzlast 4032-B-gepackt, zusammenhängend ab
0x400000;entry_pointist die volle virtuelle Adresse (normal0x400000=_start). Stapel 16 KB, Seitenkarte bis 8192 Seiten (= 32 MB Abbild).
Noch offen
- IOFS-Zero-Load-Executor (Abschnitt 6 beschreibt den Entwurf, nicht den Stand)
- ARM64-LYX! (WP-5)
- Signaturen und die Vertrauenskette aus Abschnitt 5
- Modus B (Sub-Page-Packing) — es gibt kein Flag dafür, siehe Abschnitt 2
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
Ein Flag dafür gibt es nicht.--lbf-packedwird auch vonlyxc 1.1.11Babgewiesen:lyxc: unbekannter Schalter '--lbf-packed' — mit dem Verweis auflyxc --help. Der folgende Abschnitt beschreibt den vorgesehenen Modus, nicht den heutigen Stand —--target=lyxoserzeugt Modus A.
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
Hier weichen Entwurf und Umsetzung voneinander ab. Die Byte-Tabelle weiter unten ist die Entwurfsfassung aus der Formatspezifikation. Waslyxcheute erzeugt und waskernel/lbf_exec.lyxliest, sieht anders aus — beides steht hier, damit niemand aus der falschen Tabelle liest.
Umsetzung: was heute in der Datei steht
Jeder 4096-Byte-Block beginnt mit einem 64-Byte-Blockkopf; darauf folgen 4032 Byte Nutzlast. Das gilt auch für Block 0 — die Genesis-Felder liegen also hinter dem Blockkopf.
| Datei-Offset | Feld (Nutzlast-Versatz) | Größe | Bedeutung |
|---|---|---|---|
| 0x0000 | magic | 4 | „LYX!“ |
| 0x0040 | content_type (+0x00) | 1 | 1 = ausführbar |
| 0x0041 | target_arch (+0x01) | 1 | 1 = x86-64 |
| 0x0044 | entry_point (+0x04) | 8 | volle virtuelle Adresse, normal 0x400000 |
| 0x0058 | stack_size (+0x18) | 4 | Stapelgröße in Byte |
| 0x00AC | tlv_offset (+0x6C) | 2 | Anfang des TLV-Pools, Vorgabe 0x0080 |
| 0x00C0 | TLV-Pool (+0x80) | Rest | Type-Length-Value, siehe unten |
Nachgemessen an einem Programm mit @capabilities([fs.read, hardware.block]), übersetzt mit lyxc 1.1.11B:
content_type 1 arch 1 entry 0x400000 stack_size 131072 tlv_offset 0x80
typ 5 len 8 CAPS 0x41
typ 8 len 2 0000
typ 9 len 8 SECTION_MAP start_block=1 count=2 typ=1 prot=5
typ 9 len 8 SECTION_MAP start_block=2 count=2 typ=2 prot=4
typ 9 len 8 SECTION_MAP start_block=3 count=2 typ=3 prot=3
Die Typnummern der Umsetzung weichen von der Entwurfsliste in Abschnitt 4 ab:
| Typ | Umsetzung (kernel/lbf_exec.lyx) | Entwurfsliste |
|---|---|---|
| 5 | CAPABILITIES (u64) | EXT_META_PTR |
| 9 | SECTION_MAP: start_block(u32), count(u16), type(u8), prot(u8) | reserviert für DWARF-Unwind |
| 7 | — (nicht erzeugt) | CAPABILITIES |
Im SECTION_MAP-Eintrag wertet der Kernel heute ein Bit aus: prot Bit 1 (LBF_PROT_WRITE) entscheidet, ob die Seiten beschreibbar eingehängt werden. Sektionstyp 4 ist .bss — dafür stehen keine Daten in der Datei, der Kernel nullt den Bereich.
Entwurfsfassung: 96-Byte-Header + 4000-Byte-Pool
Diese Tabelle beschreibt die geplante Fassung, nicht den heutigen Stand. Block 0 als vollständiges 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.
Die Nummern in diesem Abschnitt sind die Entwurfsfassung. Umgesetzt sind heute Typ 5 = CAPABILITIES und Typ 9 = SECTION_MAP;lyxc 1.1.11Berzeugt genau diese beiden (dazu einen leeren Typ 8). Die Zuordnung steht in Abschnitt 3 unter „Umsetzung„; der Kernel liest sie inkernel/lbf_exec.lyx.
Typen 0x09–0x0F sind im Entwurf reserviert: 0x09 (DWARF-Unwind-Frame) und 0x0A (Debug-Symboltabelle) sind für v1.2 geplant (siehe Versionstabelle). Typen 0x0B–0x0F sind unbelegt und dürfen von Custom-Toolchains genutzt werden, sofern ein Vendor-Präfix in HUMAN_INTENT (TLV 0x01) deklariert ist.
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:
CR3
—-
===== 6. Zero-Load auf nativem IOFS =====
Das Herzstück des Formats: auf IOFS wird kein Segment in den RAM kopiert.
> Hintergrund für Junior-Entwickler: 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
ist das CPU-Register das auf die Seitentabelle (Page Table) des laufenden Prozesses zeigt — es bestimmt welche virtuellen Adressen auf welche physischen RAM-Seiten zeigen. LBA (Logical Block Address) ist die physische Sektor-Adresse auf der NVMe-SSD. PTE (Page Table Entry) ist ein einzelner Eintrag in dieser Tabelle. CPUID ist eine x86-Instruktion mit der die CPU ihre eigenen Fähigkeiten (AVX, AES-NI usw.) meldet.
lbf_run
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 =====
--lbf-packed
→ Alle Optionen des Inspektors: lbfdump
<box gh>
> Diese früher hier genannten Aufrufe gibt es nicht (erneut nachgemessen mit lyxc 1.1.11B):
>
> * # Natives LYX! (Maschinencode) — Produktionspfad
lyxc main.lyx --target=lyxos -o main.lbf
# IR-Bytecode LBF\0 — NUR Simulation/Test, kein nativer Code!
lyxc main.lyx --target=lyxos --emit=lbf -o main.lbf.ir
# Cross-Compilation
lyxc main.lyx --target=arm64 -o main_arm.lbf
# Debug-LBF (TLV 0x06 zeigt auf lokale .lyx-Dateien)
lyxc main.lyx --target=lyxos --debug -o main.lbf
# Genesis-Block, TLV-Pool und Sektionen inspizieren
lbfdump -x main.lbf
# IR-Bytecode disassemblieren
lbfdump -d main.lbf.ir
(Sub-Page-Packing, Modus B) und --isa=… — beide werden mit unbekannter Schalter und Exit 2 abgewiesen.
> * Die Werkzeuge lbf_dump, lbf_run und lbf_import sind nicht installiert. Für die Inspektion gibt es lbfdump; eine Prüf-Option für CI (--verify-only) hat es nicht — der Genesis-Block nennt aber die gespeicherte CRC32C, die sich mit -f ablesen lässt.
</box>
—-
===== 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 0x0A: Debug-Symboltabelle. Achtung: 0x09 ist in der Umsetzung bereits als SECTION_MAP belegt — der geplante DWARF-Unwind-Frame braucht eine andere Nummer |
| 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-25
Letzte Aktualisierung: 2026-08-27 — Stand gegen lyxc 1.1.11B und kernel/lbf_exec.lyx nachgemessen: mehrere Sektionen und W^X sind umgesetzt (SECTION_MAP-TLV, Schreibbarkeitskarte je Seite), die Rechte kommen fail-closed aus der CAPABILITIES''-TLV. Genesis-Layout der Umsetzung ergänzt (64-Byte-Blockkopf, Felder ab +0x40, TLV-Pool ab 0xC0) und von der Entwurfsfassung getrennt; abweichende TLV-Nummern (5 statt 7, 9 statt reserviert) benannt.
