Inhaltsverzeichnis

ELF-Sektion: .meta_safe

Die .meta_safe Sektion ist eine spezialisierte Datenstruktur innerhalb der ELF64-Binärdatei, die vom Lyx-Compiler (v0.9.0+) automatisch erzeugt wird, wenn eine Unit mit @integrity annotiert ist. Sie dient als vertrauenswürdige Referenz für die Hardware-Fehlertoleranz und den TMR-Abstimmungsmechanismus.

1. Struktur und Layout

Die Sektion hat eine feste Größe von 8232 Bytes. Sie ist so entworfen, dass die kritischen CRC32-Hashes durch physikalisches Padding (4096 Bytes, entsprechend einer typischen Memory-Page) getrennt sind, um die Auswirkungen lokaler Hardware-Defekte zu minimieren.

Offset (Byte) Feld Typ Beschreibung
0..7 code_start_va uint64 LE Start-Virtual-Address des geschützten Code-Segments.
8..15 code_end_va uint64 LE End-Virtual-Address des geschützten Code-Segments.
16..19 mode uint32 LE Integritätsmodus (1=lockstep, 2=scrubbed, 3=hw_ecc).
20..23 interval_ms uint32 LE Prüfintervall in Millisekunden.
24..31 recovery_ptr uint64 LE Adresse einer Recovery-Routine (0 = nicht gesetzt).
32..35 hash_copy_1 uint32 LE Erster CRC32 IEEE 802.3 Hash des Codes.
36..4127 Padding 4092 B Null-Bytes zur physikalischen Trennung.
4128..4131 hash_copy_2 uint32 LE Zweite, identische Kopie des Hashes.
4132..8223 Padding 4092 B Null-Bytes zur physikalischen Trennung.
8224..8227 hash_copy_3 uint32 LE Dritte, identische Kopie des Hashes.
8228..8231 Padding 4 B Abschluss-Padding.

2. Triple Modular Redundancy (TMR) Effekt

Durch die Speicherung von drei identischen Kopien an weit auseinanderliegenden Offsets implementiert Lyx ein statische TMR:

3. Compiler-Workflow (Post-Patching)

Da der CRC32-Hash den finalen Maschinencode abbilden muss, folgt der Compiler einem speziellen Ablauf:

  1. Codegen: Das Backend erzeugt den kompletten x86_64/ARM64 Maschinencode.
  2. Placeholder: Die .meta_safe Sektion wird zunächst mit Platzhaltern angelegt.
  3. Calculation: Der Compiler berechnet den CRC32 über das fertige Code-Segment.
  4. Patching: Die drei Hash-Slots in der ELF-Datei werden NACH der Generierung mit dem echten Wert überschrieben.

4. Verwendung in der Applikation

Die Sektion wird primär durch das Builtin VerifyIntegrity() ausgewertet:

@integrity(mode: scrubbed, interval: 100)
unit;
 
fn check_startup() {
  if (VerifyIntegrity()) { 
    PrintStr("ELF .meta_safe verified.\n"); 
  }
}