| Zeile 1: | Zeile 1: | ||
{{TODO| | {{TODO| | ||
*Einige Exceptions ausführlicher beschreiben | *Einige Exceptions ausführlicher beschreiben | ||
| − | |||
*Mehr praktische Hinweise | *Mehr praktische Hinweise | ||
| − | + | }} | |
Als Exception (engl. Ausnahme) bezeichnet man einen Fehler, der während des Ausführens eines Programmes auftritt. Es entsteht also eine Ausnahmesituation, in der die Programmausführung nicht wie geplant fortgesetzt werden kann. Eine der bekanntesten Exception ist die 'Divide by Zero'-Exception, die auftritt, wenn man versucht durch Null zu teilen. | Als Exception (engl. Ausnahme) bezeichnet man einen Fehler, der während des Ausführens eines Programmes auftritt. Es entsteht also eine Ausnahmesituation, in der die Programmausführung nicht wie geplant fortgesetzt werden kann. Eine der bekanntesten Exception ist die 'Divide by Zero'-Exception, die auftritt, wenn man versucht durch Null zu teilen. | ||
| Zeile 88: | Zeile 87: | ||
=== Device Not Available === | === Device Not Available === | ||
| − | Wird ausgelöst, wenn | + | Wird ausgelöst, wenn eine FPU-Instruktion ausgeführt werden soll, obwohl an den Computer keine FPU angeschlossen ist. Dieser Fehler ist bei neueren Computern eher nicht mehr relevant. |
=== Double Fault === | === Double Fault === | ||
| − | Wenn eine Exception eintritt während die CPU versucht, den Handler für eine andere Exception aufzurufen, dann bezeichnet man dies als Double Fault. Dieser ist im Grunde der letzte Schritt vorm Triple Fault ( | + | Wenn eine Exception eintritt während die CPU versucht, den Handler für eine andere Exception aufzurufen, dann bezeichnet man dies als Double Fault. Dieser ist im Grunde der letzte Schritt vorm Triple Fault (Systemabsturz) und kann nicht in irgendeiner Art behoben werden. |
=== Coprocessor Segment Overrun === | === Coprocessor Segment Overrun === | ||
| Zeile 122: | Zeile 121: | ||
=== Page Fault === | === Page Fault === | ||
Der Page Fault wird ausgelöst, wenn ein Programm... | Der Page Fault wird ausgelöst, wenn ein Programm... | ||
| − | * auf eine Page | + | * auf eine Page zugreift, die nicht aktiv ist (Present-Bit gelöscht). |
* Daten in eine Page schreibt, die als nur lesbar markiert ist. | * Daten in eine Page schreibt, die als nur lesbar markiert ist. | ||
| − | * auf eine Page | + | * auf eine Page zugreift, dessen Reserved-Bit gesetzt ist. |
* in Ring 3 (Usermode) läuft und auf eine Page zugreift, die nur für den Kernel (Ring 0) zugänglich ist. | * in Ring 3 (Usermode) läuft und auf eine Page zugreift, die nur für den Kernel (Ring 0) zugänglich ist. | ||
| Zeile 149: | Zeile 148: | ||
Wenn bei aktiviertem [[Paging]] eine Speicherseite nicht zugegriffen werden kann, kann das beispielsweise daran liegen, dass diese Seite auf die Festplatte ausgelagert worden ist. In diesem Fall lädt der Kernel die Seite wieder in den Speicher und springt zurück in das Programm. Diese Methode bezeichnet man als [[Swapping]]. | Wenn bei aktiviertem [[Paging]] eine Speicherseite nicht zugegriffen werden kann, kann das beispielsweise daran liegen, dass diese Seite auf die Festplatte ausgelagert worden ist. In diesem Fall lädt der Kernel die Seite wieder in den Speicher und springt zurück in das Programm. Diese Methode bezeichnet man als [[Swapping]]. | ||
| − | Eine weitere Anwendungsmöglichkeit ist Copy on Write. Es kommt zum Einsatz, wenn ganze Pages kopiert werden - z.B. bei unixoiden Systemen bei fork(), dem Klonen von Prozessen. Dabei werden alle zu kopierenden Seiten zunächst nicht wirklich kopiert, sondern sowohl im alten als auch neuen Prozess als schreibgeschützt markiert. Erst bei Bedarf, also wenn sich die Originalpage und Kopie zum ersten Mal unterscheiden, wird wirklich kopiert: Beim ersten Schreibzugriff auf eine solche Seite wird ein Page Fault abgefangen (der ausgelöst wird, weil der Bereich schreibgeschützt ist) und eine zweite Page für die Kopie | + | Eine weitere Anwendungsmöglichkeit ist Copy on Write. Es kommt zum Einsatz, wenn ganze Pages kopiert werden - z.B. bei unixoiden Systemen bei fork(), dem Klonen von Prozessen. Dabei werden alle zu kopierenden Seiten zunächst nicht wirklich kopiert, sondern sowohl im alten als auch neuen Prozess als schreibgeschützt markiert. Erst bei Bedarf, also wenn sich die Originalpage und Kopie zum ersten Mal unterscheiden, wird wirklich kopiert: Beim ersten Schreibzugriff auf eine solche Seite wird ein Page Fault abgefangen (der ausgelöst wird, weil der Bereich schreibgeschützt ist) und eine zweite Page für die Kopie allokiert. |
=== x87 Floating Point === | === x87 Floating Point === | ||
| Zeile 155: | Zeile 154: | ||
=== Alignment Check === | === Alignment Check === | ||
| − | Wenn auf nicht ausgerichtete Daten zugegriffen wird und | + | Wenn auf nicht ausgerichtete Daten zugegriffen wird und das AM Bit in CR0 sowie das AC in den EFLAGS sind gesetzt, dann wird diese Exception ausgelöst. In der Regel trifft man nicht auf diese Exception, weil Alignment Checks standartmäßig ausgeschaltet sind. |
=== Machine Check === | === Machine Check === | ||