- Schutzverletzung
-
Bei Computern tritt eine Schutzverletzung (vom engl. segmentation fault oder segmentation violation, kurz segfault) oder Zugriffsverletzung (engl. access violation) auf, wenn ein Computerprogramm auf eine Ressource (insbesondere auf Speicher) zuzugreifen versucht, die vor einem solchen Zugriff geschützt bzw. nicht erreichbar ist. Hierbei sendet der Betriebssystemkern (Kernel) ein Signal zum Prozess, der den Fehler ausgelöst hat. Dies führt im Normalfall zur Beendigung des Prozesses. Durch den Speicherschutz moderner Betriebssysteme und Memory Protection Units der Mikrocontroller werden dadurch andere Prozesse und das Betriebssystem geschützt.
Der Umkehrschluss ist unzulässig: nicht jeder fehlerhafte Speicherzugriff löst die Ausnahmebedingung „Schutzverletzung“ aus. Ein und derselbe Programmfehler kann je nach allgemeinem Systemzustand, also in im allgemeinen nicht kontrollierbarer Weise, einen Absturz wegen Schutzverletzung auslösen, zu arithmetisch falschen Rechenergebnissen oder anderen unerwünschten Systemverhalten führen und auch ganz folgenlos bleiben.
Die englische Bezeichnung segmentation fault stammt aus einer Zeit, in der Speicherbereiche durch Segmentierung vor unerlaubtem Zugriff geschützt wurden. Heute werden andere Schutzmechanismen verwendet, insbesondere Paging; der Terminus segmentation fault hat sich aber unverändert erhalten. Der segmentation fault ist nicht zu verwechseln mit dem page fault (Seitenfehler), der lediglich das Programm so lange unterbricht, bis die fehlende Seite in den Hauptspeicher geladen wurde.
Unter Unix löst segmentation violation die Ausnahmebedingung SIGSEGV (numerisch 11) aus.[1] Bei IA-32 bzw. x86-Prozessoren wird eine Speicherzugriffsverletzung als Allgemeine Schutzverletzung (Ausnahme 13) bezeichnet, die über einen Interrupt ausgelöst wird.[2]
Beispiele
Massenhaftes Auftreten von Schutzverletzungen deutet auf konzeptionelle Schwächen eines Betriebssystems, einer Programmiersprache oder eines Programms hin. Schutzverletzungen sind notorisch unter Fortran. Einem breiten Publikum in Erinnerung geblieben ist die Fehlermeldung „Allgemeine Schutzverletzung in“, gefolgt von einer Hexadezimal-Adresse (Blue Screen), mit der Programme unter frühen Microsoft Windows-Versionen häufig abstürzten.
Ein seltenerer Grund für gehäuftes Auftreten von Schutzverletzungen kann defekter Arbeitsspeicher oder andere defekte Hardware sein. Dabei werden durch Hardwarefehler ungewollte Adressen angesprochen (z. B. reicht es, ein einzelnes Bit einer Adresse zu wechseln). Auch Übertakten kann solche Fehler auslösen, ohne dass dafür ein Defekt notwendig ist.
Beispiel eines C-Programmes, das so gut wie immer und auf jedem System eine Schutzverletzung auslöst:
int main(void) { int *ptr = 0; // Zeiger auf die Speicheradresse 0. *ptr = 0; // Schreibe 0 in die gespeicherte Adresse. // Dieser Speicherbereich gehört jedoch nicht zum Programm // und ist deshalb "geschützt" (daher Schutzverletzung). return 0; }
Einzelnachweise
- ↑ Sourceware.org: Sourcecode der UNIX-Header-Datei signal.h. Abgerufen am 14. September 2010.
- ↑ Klaus Wüst: Mikroprozessortechnik: Grundlagen, Architekturen und Programmierung von Mikroprozessoren, Mikrocontrollern und Signalprozessoren. 3. Auflage, Vieweg+Teubner Verlag, Wiesbaden 2009, S. 174–179, ISBN 978-3-8348-0461-7.
Kategorie:- Betriebssystemtheorie
Wikimedia Foundation.