Memory Scrubbing (Code-Integrität)
Memory Scrubbing ist ein präventiver Sicherheitsmechanismus in Lyx (v0.9.0+), der darauf abzielt, „schleichende“ Speicherfehler (Single Event Upsets / Bit-Flips) im Programmbereich (Code-Segment) zu erkennen, bevor sie ausgeführt werden.
Dies ist besonders kritisch für Systeme, die kosmischer Strahlung ausgesetzt sind (Aerospace), da ein Bit-Flip in einer Instruktion zu unvorhersehbarem Programmverhalten führen kann.
1. Aktivierung via @integrity
Das Scrubbing wird durch das Modul- oder Funktions-Attribut @integrity mit dem Modus scrubbed konfiguriert.
@integrity(mode: scrubbed, interval: 100) unit nav.core;
- mode: scrubbed: Aktiviert die periodische Überprüfung des Codesegments.
- interval: 100: Legt fest, dass alle 100 Millisekunden ein vollständiger Prüfdurchlauf (Sweep) stattfinden soll.
2. Funktionsweise: Der Hintergrund-Sweep
Im Gegensatz zum Software Lockstep, der während der Berechnung prüft, arbeitet das Scrubbing als Hintergrundprozess oder periodischer Interrupt:
- Referenz-Hashes: Der Compiler hinterlegt bei der Erstellung drei identische CRC32-Hashes des Codesegments in der ELF-Sektion: .meta_safe ELF-Sektion.
- Periodische Prüfung: Die Runtime liest das aktuelle Codesegment im RAM bitweise aus und berechnet einen neuen Prüfsummenwert.
- TMR-Vergleich: Der neu berechnete Wert wird gegen die drei Referenz-Hashes in
.meta_safeverglichen (Triple Modular Redundancy). - Fehlermeldung: Wird eine Abweichung festgestellt (d. h. der RAM-Inhalt stimmt nicht mehr mit der Mehrheit der Hashes überein), wird ein Integritätsfehler ausgelöst, bevor der korrumpierte Code Schaden anrichten kann.
3. Integration mit VerifyIntegrity()
Entwickler können den Scrubbing-Status auch manuell innerhalb der Applikationslogik abfragen, um auf erkannte Fehler zu reagieren:
fn main(): int64 {
if (!VerifyIntegrity()) {
// Notfall-Prozedur: Systemneustart oder Umschalten auf Backup-Computer
panic("Code corruption detected via Memory Scrubbing");
}
return 0;
}
4. Vor- und Nachteile
| Merkmal | Beschreibung |
|---|---|
| Vorteil | Erkennt Fehler in passiven Codeteilen, bevor diese aufgerufen werden. |
| Vorteil | Geringerer Performance-Impact pro Instruktion im Vergleich zu Lockstep. |
| Nachteil | Zwischen zwei Sweeps besteht ein kleines Zeitfenster, in dem ein Fehler unentdeckt bleiben kann (abhängig vom Intervall). |
| Einschränkung | Erfordert die .meta_safe Sektion im ELF-Header für den TMR-Vergleich. |
